Existe-t-il un algorithme à temps linéaire pour vérifier qu'une séquence de caractères est une concaténation de palindromes? La seule chose qui me vient à l'esprit est la solution naïve:
1. k = 1
2. Split string into k substrings (all possibilities) and check
3. k++
4. repeat
Remarque: la réponse est trivialement oui si les chaînes de longueur 1 sont définies comme des palindromes. Supposons que ce n'est pas le cas.
algorithms
efficiency
strings
saadtaame
la source
la source
Réponses:
En supposant que vous vouliez des palindromes disjoints, cela est connu comme le problème PALSTAR, et il y a un algorithme de temps linéaire par Zvi Galil et Joel Seiferas. Un algorithme de reconnaissance en ligne en temps linéaire pour `` Palstar '' .
Vous pouvez trouver une explication de l'algorithme dans le livre ici: Text Algorithms (regardez la page liée et les pages précédentes).
Si vous êtes d'accord avec un algorithme de temps quadratique, la programmation dynamique directe semble fonctionner.
Étant donné une chaîne , nous maintenons un tableau nous indiquant si peut être décomposé en palindromes.s[1,…n] s[1,…j]
Nous maintenons également une table 2D qui nous indique si est un palindrome ou non. Nous pouvons construire cela en temps en choisissant un centre et en déplaçant deux pointeurs vers l'extérieur, en vérifiant les palindromes avec ce centre. Faites cela pour chaque centre possible: centres, chacun prenant fois.s[i,…j] O(n2) Θ(n) O(n)
Maintenant, vous pouvez vérifier si peut être décomposé en palindromes, en vérifiant pour chaque si peut être décomposé, et si est un palindrome (en utilisant le tableau 2D ci-dessus). On obtient ainsi un temps et algorithme de l' espace.s[1,…j+1] 1≤i≤j−1 s[1,…i] s[i+1,…,j+1] Θ(n2) Θ(n2)
L'utilisation de l'espace peut être ramenée à , si vous utilisez l'algorithme en ligne de Manacher pour calculer si est un palindrome (comme passe de à ) , se débarrassant essentiellement de la table 2D.O(n) s[i+1,…j+1] i j−1 1
la source
Si le chevauchement est autorisé, cela peut être fait en temps linéaire (dans la taille de la chaîne d'entrée).
Quelques définitions
Définissons le concept de palindrome maximal :
Un palindrome maximal de rayon k d'une chaîne S est une sous-chaîne S 'telle que
par exemple, si
S = banana
, alorsS' = anana
est un palindrome maximal de rayon 2.Un palindrome maximal est un palindrome maximal de rayon k pour certains k.
Par exemple, si
S = banana
,"ana"
,"anana"
, sont tous ses palindromes maximale.Utilisation de palindromes maximaux
Maintenant, si nous pouvions localiser tous les palindromes maximaux d'une chaîne , il serait simple de vérifier si la chaîne entière est une concaténation de palindromes.
Prenez
S = abbaccazayaz
. Ses palindromes maximaux sont:donc "abba" s'étend sur [1..4], "acca" s'étend sur [4..7], "zayaz" s'étend sur [8..12]. Puisque la concaténation de ces trois palindromes (le chevauchement est autorisé?) S'étend sur toute la chaîne, il s'ensuit que "abbaccazayaz" est la concaténation des palindromes.
Calcul des palindromes maximaux en temps linéaire
Maintenant, il s'avère que nous pouvons localiser tous les palindromes maximaux d'une chaîne S en temps linéaire !
*
L'idée est d'utiliser un arbre de suffixes pour S équipé de requêtes d'ancêtres communs à temps constant .
On peut donc vérifier si une chaîne S de longueur m est une concaténation de palindromes en temps O (n).
*
Gusfield, Dan (1997), "9.2 Trouver tous les palindromes maximaux en temps linéaire", Algorithmes sur les chaînes, les arbres et les séquencesla source
nana
n'est pas un palindrome, je suppose que vous vouliez dire à laanana
place.Supposons que Palindrome [] [] est un tableau et Palindrome (i, j) est une fonction qui vérifie si la sous-chaîne de i à j est palindrome et renvoie 1 si est palindrome ou renvoie l'infini si ce n'est pas palindrome, et si vous recherchez le plus petit nombre de partitions, créez-le de bas en haut:
Vous devez remplir cellules et chaque cellule prend au plus donc l'algorithme est , avec une petite modification (prétraitement) vous pouvez l'améliorer en , aussi trouver cette partition n'est pas difficile.O(n2) O(n) O(n3) O(n2)
la source
abbaaccaabba.