題目描述
給你一個由小寫英文字母組成的字串 S, S 有多少個不同的非空子串?
子串是連續的子序列。例如,xxx是yxxxy的子串,但不是xxyxx的子串。
資料範圍:S 是長度在 1 和 100 之間(含)的字串,由小寫英文字母組成。
題解
我認為這道題放在普及組的話,非常適合放在第一題和第二題之間,當我們看到資料範圍是100的話,這個最大可承受的時間複雜度是\(O(n^4)\),所以我們可以列舉。這裡要求的是所以不同的非空子串的長度,所以我們需要在每個長度上都找出是否有相同的子串,比如說yay,在長度為1的時候,就是相同的非空子串
所以第一個維度我們應該先列舉長度len,第二個維度列舉起點i,那麼終點我們就知道了,是j=i+len,對於每一個\((i,j)\)之間的子串,我們來比較長度為len的,起點k在\([1-i-1]\)的所有子串,是否和\([i,len]\)的子串相同,所以我們列舉len,列舉起點i,列舉子集的起點k,比較字串是否相等,時間複雜度是\(o(n^4)\),程式碼如下:
點選檢視程式碼
#include <bits/stdc++.h>
using namespace std;
const int maxn=105;
char s[maxn];
int ans;
int main(){
scanf("%s",s+1);
int n=strlen(s+1);
for(int len=1;len<=n;len++){
for(int i=1;i<=n;i++){
if(i+len-1>n) break;
int cnt=0;
for(int j=1;j<i;j++){
int k=0;
while(s[i+k]==s[j+k]&&k<len) k++;
if(k==len) {
cnt=1;
break;
}
}
if(cnt==0) {
//cout<<i<<endl;
ans+=1;
}
}
}
cout<<ans<<endl;
return 0;
}