d'abord trouver tous les palindromes dans la chaîne tel que L [i] [j] représente la longueur du j-ième plus long palindrome qui se termine à S [ je]. Disons que S est la chaîne d'entrée. Ceci pourrait être fait en temps O (N^2) en considérant d'abord les palindromes de longueur1 puis les palindromes de longueur 2 et ainsi de suite. Trouver la longueur i palindromes après que vous connaissez toutes les longueurs palindromes i-2 est la question d'une comparaison de caractères unique.
Ceci est un problème de programmation dynamique par la suite. Soit A [i] représente le plus petit nombre de palindrome dans lequel la sous-chaîne (S, 0, i-1) peut être décomposée.
A[i+1] = min_{0 <= j < length(L[i])} A[i - L[i][j]] + 1;
Modifier basé sur la demande de Micron: Voici l'idée derrière comuting L [i] [j]. Je viens d'écrire ceci pour transmettre l'idée, le code peut avoir des problèmes.
// Every single char is palindrome so L[i][0] = 1;
vector<vector<int> > L(S.length(), vector<int>(1,1));
for (i = 0; i < S.length(); i++) {
for (j = 2; j < S.length; j++) {
if (i - j + 1 >= 0 && S[i] == S[i-j + 1]) {
// See if there was a palindrome of length j - 2 ending at S[i-1]
bool inner_palindrome = false;
if (j ==2) {
inner_palindrome = true;
} else {
int k = L[i-1].length;
if (L[i-1][k-1] == j-2 || (k >= 2 && L[i-1][k-2] == j-2)) {
inner_palindrome = true;
}
}
if (inner_palindrome) {
L[i].push_back(j);
}
}
}
}
Ma réponse serait: Quel genre de produit lame ass cherche des palindromes dans une chaîne. Puis-je regarder de plus près votre plan d'affaires, s'il vous plaît? –
c'est le type de question où une personne peut l'étudier pendant 20, 30 minutes, trouver une solution possible, puis l'étudier pendant 1 heure ou plus, et trouver la meilleure ou la meilleure solution, puis demander à une personne interrogée et voyez quelle solution il a en 2 minutes. –
Je suis curieux de savoir si cela peut être fait en temps prouvable subquadratique, peut-être même O (n) temps.Je sais comment faire le pré-traitement standard pour trouver le palindrome le plus long à chaque position en O (n) temps en utilisant des arborescences de suffixes, mais l'algorithme itératif le plus naturel que je puisse imaginer pour faire le reste du calcul est O (n * max # de palindromes maximaux se chevauchant). – jonderry