這道題目通過例子可以看出查找最長的相同子串,下一個長度如果沒有找到相同的子串就是結果,需要寫三個循環,第一個循環是是否存在長度為len的相同子串,第二個循環是從左往右截取長度為len的子串,第三個循環的條件是j<i,保證了截取的子串的起始位置是不同的。如果截取的子串是相同,說明要繼續查找更長的子串。
for(int len=1;len<=n;len++){
bool g = true;
for(int i=0;i+len<=n;i++){
for(int j=0;j<i;j++){
if(s.substr(i,len) == s.substr(j,len))
g = false;
}
}
if(g){
cout<<len;
break;
}
}
????我現在越來越喜歡一題多解的題目了,可以開拓學生們的思維,鼓勵他們創造想法,接下來的內容是看到usaco guide后發現可以利用set來解。
????set不能存儲重復的元素,但是將截取的另外一個子串判斷是否在set中,如果存在繼續加大len查找,直到沒有相同在len長度的子串,就是結果了。
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
bool dups(int len){
set<string> x;
for(int i=0;i<=n-len;i++){
if(x.count(s.substr(i,len)) > 0) return true;
x.insert(s.substr(i,len));
}
return false;
}
int main(){
??cin>>n>>s;
int ans=1;
while(dups(ans)){
ans++;
}
cout<<ans;
return 0;
}