부분 문자열의 길이는 1,2,3 ... 입니다. 해결하기 위해 시도한 질문에는 최대 횟수가 발생한 부분 문자열을 찾는 것이 포함되었습니다. 그래서 그것은 기본적으로 최대 빈도를 가진 캐릭터를 찾는데 실패했습니다. 그러나 O (n)에서 접미어 트리를 사용하여 가장 긴 반복 부분 문자열을 찾을 수 있다는 것을 알았습니다. 그러나 suffix tree는 길이를 우선 순위로 유지하면서 하위 문자열을 반환합니다. 가장 많은 횟수로 발생하는 하위 문자열을 찾고 싶었고 하위 문자열 중에서 가장 긴 문자열을 찾고 싶습니다. 예를 들어 는 :가장 긴 최대 반복 부분 문자열
In the following string: ABCZLMNABCZLMNABC
A suffix tree will return ABCZLMN as the longest repeating substring.
However, what I am looking for is ABC; as it is the longest out of all the ones having frequency = 3.
I 두 지수 I와 J 사이의 문자열을 생성함으로써,이 문제를 해결하려고. 그 후 O (n)에서 실행되는 Z 알고리즘을 사용하여 각 부분 문자열의 발생을 찾습니다. 그러나 전체 복잡성은 내가 그것을 효율적으로 만들 수있는 적합한 솔루션을 찾을 수 없습니다입니다 (N^3)
내 O (N^3) 코드
map<ll,vector<string>> m;
string s; cin >> s;
for(ll i=0;i<s.length();i++){
string c;
for(ll len=0; i+len<s.length();len++){
c+=s[i+len];
ll z[N];
ll l=0,r=0;
string kk;
for(ll p=0;p<c.length();p++){
kk+=c[p];
}
kk+="#";
for(ll p=0;p<s.length();p++){
kk+=s[p];
}
for(ll k=1;k<kk.length();k++){
if(k>r){
l=r=k;
while(r<c.length()&&kk[r-l]==kk[r])r++;
z[k]=r-l;
r--;
}
else{
ll m=k-l;
if(z[m]<r-k+l)z[k]=z[m];
else{
l=k;
while(r<c.length()&&kk[r-l]==kk[r])r++;
z[k]=r-l;
r--;
}
}
}
ll occ=0;
for(ll n=0;n<kk.length();n++){
if(z[n]==c.length())occ++;
}
m[occ].push_back(c);
}
}
O했다. 친절히 도와주세요. 감사합니다.
ㅎ ... 숙제? SO는 "나를 위해 할"사이트가 아닙니다. 약간의 코드를 작성하고 잘못된 것이 있으면 다시 찾으십시오. – folibis
그래,하지만 최소한 코드를 보여줘. – folibis
두 인덱스 i와 j 사이에 하위 문자열을 생성하여이 문제를 해결하려고했습니다. 그 후 O (n)에서 실행되는 Z 알고리즘을 사용하여 각 부분 문자열의 발생을 찾습니다. 그러나 총 복잡성은 O (n^3)이었다. –