Ich möchte überprüfen, ob eine Zeichenfolge mit einem palindromischen Teilstring beginnt; Ich suche nach dem längsten palindromischen Teilstring, der mit dem Start meines Arrays beginnt. Dies ist ein trivialer Ansatz in O(n*n)
. Gibt es einen klügeren Weg?Wie überprüft man, ob eine Zeichenfolge mit einem Palindrom beginnt?
//not safe for empty string
bool isPalindrome(string s)
{
string rev = s;
std::reverse(rev.begin(), rev.end());
return rev == s;
}
int startWithPalindome(const string a)
{
int N = a.length();
for (int len = N; len > 0; len--)
{
bool isPal = isPalindrome(a.substr(0,len));
if (isPal)
return len;
}
return -1;
}
EDIT: Klarstellung: Ich weiß, dass dieser Code kann auf viele Art und Weise verbessert werden, variout zwickt zu tun, aber ich bin interessiert an asymptotische Zeitkomplexität zu reduzieren.
In isPalindrome müssen Sie nicht die gesamte Zeichenfolge umkehren. Sie wissen, wenn Sie ein Palindrom in der Mitte der Marke haben – user4581301
Alle Strings beginnen trivial mit einem Null-Länge Palindrom, so dass die 'Rückkehr -1;' am Ende nicht richtig scheint. – hvd
Ich würde sagen, dass Sie nach den OP-Regeln auch ein Palindrom der Länge 1 haben. Sie werden die gleiche Zeit Komplexität haben, aber wahrscheinlich eine bessere durchschnittliche Leistung haben, wenn Sie bei Länge 2 beginnen und vorwärts gehen. – user4581301