Eine Teilzeichenfolge kann die Länge 1,2,3 haben ... Die Frage, die ich zu lösen versuchte, beinhaltete das Auffinden der Teilzeichenfolge, die die maximale Anzahl von Malen aufgetreten ist. Es ist also praktisch nicht möglich, den Charakter mit der maximalen Häufigkeit zu finden. Allerdings habe ich herausgefunden, dass ich die längste sich wiederholende Teilkette mit Suffixbaum in O (n) finden kann. Suffixbaum gibt jedoch den Teilstring zurück, wobei die Länge als Priorität beibehalten wird. Ich wollte den Teilstring finden, der am häufigsten vorkommt, und von diesen Teilstrings möchte ich den längsten finden. Für zB:Längste maximale Wiederholungszeichenfolge
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.
Ich habe versucht, dieses Problem zu lösen, indem Teilkette zwischen zwei Indizes i und j zu erzeugen. Danach findet das Auftreten dieser Teilstrings jeweils unter Verwendung des in O (n) ablaufenden Z-Algorithmus statt. Allerdings ist die Gesamtkomplexität war O (n^3)
My O (n^3) Code
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);
}
}
Ich bin nicht in der Lage eine passende Lösung zu finden, um sie effizienter zu machen. Bitte helfen. Danke.
Heh ... Hausaufgaben? SO ist nicht "tue es für mich" -Seite. Versuchen Sie, Code zu schreiben, und gehen Sie zurück, wenn etwas schief läuft. – folibis
Ok, aber zeigen Sie Ihren Code zumindest. – folibis
Ich habe versucht, dieses Problem zu lösen, indem ich einen Teilstring zwischen zwei Indizes i und j erzeuge. Danach findet das Auftreten dieser Teilstrings jeweils unter Verwendung des in O (n) ablaufenden Z-Algorithmus statt. Die Gesamtkomplexität war jedoch O (n^3). –