In diesem Problem betrachten wir nur Zeichenfolgen, die aus kleingeschriebenen englischen Buchstaben (a-z) bestehen. Eine Zeichenkette ist ein Palindrom, wenn sie von links nach rechts genau das gleiche liest wie von rechts nach links.Algorithmus Hilfe wird benötigt (Codility)
Zum Beispiel sind diese Strings Palindrome:
aza
abba
abacaba
Diese Strings sind nicht Palindrome:
zaza
abcd
abacada
ein String S der Länge N gegeben, eine Scheibe S ist ein Teilwort von S angegeben durch ein Paar von ganzen Zahlen (p, q), so dass 0 ≤ p < q < N
. Eine Scheibe (p, q) der Saite S ist palindromisch, wenn die aus den Buchstaben S[p], S[p+1], ..., S[q]
bestehende Saite ein Palindrom ist.
Zum Beispiel kann in einem String S = abbacada:
slice (0, 3) Palindrom ist, weil abba
ein Palindrom ist,
Scheibe (6, 7) nicht palindromische weil da
kein Palindrom ist,
slice (2, 5) ist nicht palindromisch, da baca
kein Palindrom ist,
Scheibe (1, 2) ist palindrom, weil bb
ein Palindrom ist.
Schreibe eine Funktion int solution(const string &S);
, die eine Zeichenfolge S der Länge N Buchstaben angegeben, die Anzahl der Scheiben von palindromischen S. gibt die Funktion zurückgeben sollte -1, wenn diese Zahl größer als 100.000.000 ist.
Zum Beispiel für String S = baababa
sollte die Funktion 6 zurückgeben, weil genau sechs ihrer Scheiben palindrom sind; nämlich: (0, 3), (1, 2), (2, 4), (2, 6), (3, 5), (4, 6)
.
Angenommen, dass:
- N ist eine ganze Zahl innerhalb des Bereichs [0..20.000];
- String S besteht nur aus Kleinbuchstaben (a-z).
Komplexität:
- erwartete Zeitkomplexität im ungünstigsten Fall ist O (N);
- Die erwartete Worst-Case-Raumkomplexität ist O (N) (ohne den für Eingabeargumente erforderlichen Speicher).
Hier ist meine Lösung:
int palindrom(const string &S, int startIndex,int endIndex, int counter=0)
{
bool equals = true;
if (endIndex - startIndex < 1)
return counter;
for(int i = startIndex,j = endIndex;i<j; ++i, --j)
{
equals = S[i] == S[j];
if (!equals) break;
}
if (equals) counter++;
counter = palindrom(S,startIndex,endIndex-1,counter);
return counter;
}
int solution(const string &S)
{
int length = S.size();
int counter = 0;
if (length > 20000) return -1;
for(int i=0; i < length-1; i++)
{
counter += palindrom(S,i,length-1);
if (counter > 100000000) return -1;
}
return counter;
}
mit großen Saiten S.size()> 3000 I erhalten Laufzeitfehler immer (bedeutet in weniger als 2 Sekunden Arbeitszeit mehr als 3 Sekunden, aber Lösung sollte)! Irgendwelche Vorschläge?
ok! und Hauptfunktion ist es so etwas wie:
main(){cout<<solution("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");}
Format Ihren Code, damit wir sie ohne Scrollen lesen. Fügen Sie den Fehler ein, damit wir eine fundierte Vermutung treffen können. Auf welcher Plattform laufen Sie? Welchen Compiler benutzen Sie? – EvilTeach
Verpasse nicht die [Hilfe zur Formatierung] (http://stackoverflow.com/editing-help), sie wird dringend für eine Frage wie diese benötigt. Die Leute werden eher bereit sein, Arbeit für dich zu tun, wenn du es ihnen leicht machst. –
Die Down-Stimmen sind sinnlos. Gib ihm eine Chance, die Frage zu verbessern. Das sieht nach einem interessanten aus. – EvilTeach