Trouver toutes les sous-chaînes qui sont des palindromes
Si l'entrée est 'abba', puis le possible palindromes sont a, b, b, a, bb, abba.
Je comprends que le fait de déterminer si la chaîne est palindrome est facile. Ce serait comme:
public static boolean isPalindrome(String str) {
int len = str.length();
for(int i=0; i<len/2; i++) {
if(str.charAt(i)!=str.charAt(len-i-1) {
return false;
}
return true;
}
Mais quel est le moyen efficace de trouver un palindrome sous-chaînes?
- à l'aide de votre exemple, vous attendez-vous à obtenir de "bab" et "baab" trop?
- Je me serais attendu à pas, depuis
bab
etbaab
n'est pas une partie de la Chaîne, sauf si vous modifiez l'ordre des caractères de la première. - ce n'est pas un moyen efficace, mais vous pouvez prendre tous les sous-chaîne, et de vérifier si c'est un palindrome. Il faudrait seulement O(n^3) temps
- À l'entrée toujours un palindrome?
- Ainsi, vous pouvez modifier l'ordre des caractères comme vous le souhaitez? cela me semble être un assez grand nombre de palindromes que la chaîne va dans la taille.
- Je pense que l'ordre des caractères ne peut pas être changé.
- Êtes-vous sûr? Peut-il être mieux que O(n^3)?
- Supposons que la. Il n'a pas été mentionné dans la question.
- probablement
- "possible palindromes sont a, b, b, a, bb, abba", de Sorte que nous pouvons compter certains d'entre eux à deux reprises en fonction de leur position dans la chaîne d'origine? Cela ressemble à cela pourrait simplifier le problème grandement.
- Peut-être que vous pourriez itération à travers le potentiel de caractère du milieu (longueur impaire palindromes) et des points intermédiaires entre les personnages (même longueur de palindromes) et de l'étendre de chaque jusqu'à ce que vous ne pouvez pas obtenir de toute autre (côté gauche et droit de caractères ne correspondent pas). Qui permettrait de sauver beaucoup de calcul quand il n'y a pas beaucoup de palidromes dans la chaîne. Dans de tels cas, le coût serait en O(n) pour éparses palidrome cordes. Pour palindrome dense serait O(n^2) comme chaque position ne peut pas être prolongé plus de la longueur du tableau / 2. Évidemment, ce n'est même de moins en moins vers les extrémités de l'éventail.
- Une simple lettre ne peut pas être un palindrome comme palindrome peut être un mot, une phrase ou un vers.
- une seule lettre est un palindrome. Donc, est la chaîne vide.
- Certains personnages peuvent être considérés comme une lettre, un je o par exemple. Mais pas tous d'entre eux et pour assurer une chaîne vide ne peut pas être déclaré comme palindrome comme il n'est pas en vigueur dans l'alphabet.
- ce n'est Pas Tous les mots d'Une seule lettre peut être palindrome
- Je parlais des lettres. Définition de palindrome est (ne pas être trop formel) est identique lorsque la lecture à partir, soit du début à la fin ou dans l'autre sens. Cela s'applique certainement à la chaîne vide, trop. Notez que la chaîne vide est un sous-ensemble de toutes les chaînes.
- La définition de palindrome est celui que le professeur qui a attribué la cession dit qu'il est. 🙂 🙂 🙂
- lien: désolé, mais quand on programme, on doit penser que les ordinateurs 😉 et
'D
est de deux caractères pour l'ordinateur, pas un seul. Quand j'ai dit que seule lettre que je voulais dire d'un caractère entre a et z. - Ensuite, le dictionnaire Oxford états est vraiment clair ce qu'est un palindrome est. Il indique que vous pouvez lire. Concernant ensuite commentaire à propos apostrophe D la couture que vous n'avez pas attraper le résumé correctement. Mais ce n'est pas pertinent comme l'ajb souligné. Mais ce que vous devez savoir, c'est que les ordinateurs ne pense pas, ils n'exécutent que des états. À côté de vous n'a jamais écrit
one letter word
maissingle letter
. - J'ai bien compris le papier que vous y avez accédé. Votre lire le papier ou juste le résumé? parce que vous semblez ne pas comprendre mon commentaire. De toute façon, ce que je voulais souligner c'est qu'il y a une différence entre ce que nous appelons une seule lettre du mot dans le langage naturel et ce qui est considéré comme une seule lettre (= assignable à
char
) par les ordinateurs. Et la question est sur le programme d'ordinateur, donc je pense que nous pouvons supposer que nous parlons dechar
s.
Vous devez vous connecter pour publier un commentaire.
Cela peut être fait en
O(n)
, à l'aide de Manacher de l'algorithme de.L'idée principale est une combinaison de la programmation dynamique et (comme d'autres l'ont déjà dit) le calcul de longueur maximum de palindrome avec centre dans une lettre donnée.
Ce que nous voulons vraiment pour le calcul est rayon le plus long palindrome, et non pas la longueur.
Le rayon est tout simplement
length/2
ou(length - 1)/2
(de longueur impaire palindromes).Après le calcul de palindrome rayon
pr
à une position donnéei
nous utilisons déjà calculés rayons de trouver des palindromes dans la gamme[
i - pr ; i
]
. Cela vous permet de nous (parce que les palindromes sont, ainsi, les palindromes) ignorer les autres le calcul deradiuses
de gamme[
i ; i + pr
]
.Alors que l'on recherche dans la gamme
[
i - pr ; i
]
, il existe quatre cas pour chaque positioni - k
(oùk
est dans1,2,... pr
):radius = 0
) ài - k
(cela signifie
radius = 0
ài + k
, trop)(cela signifie
radius
ài + k
est la même qu'aui - k
)(cela signifie
radius
ài + k
est couper pour s'adapter à portée, j'.e parce quei + k + radius > i + pr
nous réduireradius
àpr - k
)i + k + radius = i + pr
(dans ce cas, nous avons besoin de la recherche pour potentiellement plus grand rayon de
i + k
)Complet, détaillé, l'explication serait plutôt le long. Les exemples de code? 🙂
J'ai trouvé C++ mise en œuvre de cet algorithme par un professeur de polonais, mgr Jerzy Wałaszek.
J'ai traduit les commentaires de l'anglais, ajouté quelques autres commentaires et simplifié un peu d'être plus faciles à attraper la pièce principale.
Jetez un oeil ici.
Remarque: en cas de difficultés à comprendre pourquoi c'est
O(n)
, essayez de regarder de cette façon:après avoir trouvé rayon (appelons
r
), à une position, nous avons besoin d'itérer surr
éléments de retour, mais comme un résultat, nous pouvons ignorer le calcul pour lesr
éléments de l'avant. Par conséquent, le nombre total de itéré éléments reste le même.radius
es est en O(n), mais je ne suis pas super sûr plus que l'itération sur tous les possibles palindromes représenté par ce tableau est O(n) trop.O(n)
, comme les résultats (imprimés sous la forme de chaînes de caractères) sont de tailleO(n^2)
- envisager la chaîne "aaaaaaaaaa", les résultats de ici. Hovewer, tableau lui-même estO(n)
taille et contient toutes les données nécessaires pour imprimer les palindromes. La représentation des résultats de choisir (il suffit d'imprimer le tableau enO(n)
ou imprimer tous les palindromes dansO(n^2)
?) est totalement distinct de l'algorithme lui-même.Peut-être que vous pourriez itération à travers le potentiel de caractère du milieu (longueur impaire palindromes) et des points intermédiaires entre les personnages (même longueur de palindromes) et de l'étendre de chaque jusqu'à ce que vous ne pouvez pas obtenir de toute autre (côté gauche et droit de caractères ne correspondent pas).
Qui permettrait de sauver beaucoup de calcul quand il n'y a pas beaucoup de palidromes dans la chaîne. Dans de tels cas, le coût serait en O(n) pour éparses palidrome cordes.
Pour palindrome dense entrées, il serait O(n^2) comme chaque position ne peut pas être prolongé plus de la longueur du tableau /2. Évidemment, ce n'est même de moins en moins vers les extrémités de l'éventail.
String
et une position de départ, puis faireresult
unSet
de qui au lieu deSet<String>
.Donc, chaque lettre est déjà un palindrome si vous avez déjà N + 1 palindromes, où N est le nombre de lettres distinctes (plus une chaîne vide). Vous pouvez le faire que dans un seul d'exécution O(N).
Maintenant, pour les non-trivial palindromes, vous pouvez tester chaque point de la chaîne pour être un centre de potentiel palindrome - se développer dans deux directions - quelque chose qui Valentin Ruano suggéré.
Cette solution permettra de prendre en O(N^2) étant donné que chaque test est O(N) et le nombre de "centres" est également en O(N) - le
center
est une lettre ou un espace entre deux lettres, là encore, comme dans Valentin solution.Note, il est également en O(N), solution à votre problème, basée sur Manacher de l' algorithme (article décrit "le plus long palindrome", mais l'algorithme peut être utilisé pour compter tous d'entre eux)
Je suis juste venu avec mon propre logique qui aide à résoudre ce problème.
Amusez-vous bien.. 🙂
Je suggère la construction d'une base de cas et l'expansion jusqu'à ce que vous avez tous les palindomes.
Il existe deux types de palindromes: paires et impaires. Je n'ai pas compris comment gérer à la fois de la même manière donc je vais le briser.
1) Ajouter toutes les lettres
2) Avec cette liste, vous avez tous les points de départ pour votre palindromes. Exécuter chaque fois pour chaque index dans la chaîne (ou 1 -> longueur-1, parce que vous avez besoin d'au moins 2 longueur):
Je ne sais pas si cela aide le Big-O pour votre runtime, mais il devrait être beaucoup plus efficace que de tenter de chaque sous-chaîne. Pire des cas serait une chaîne de toutes la même lettre, ce qui peut être pire que le "trouver tous les sous-chaîne" plan, mais avec la plupart des intrants, il coupera la plupart des sous-chaînes parce que vous pouvez arrêter de regarder une fois que vous réalisez ce n'est pas le centre d'un palindrome.
#
, entre tous les deux adjacentes lettres, ex.abba -> a#b#b#a
.J'ai essayé le code suivant et sa fonctionne bien pour le cas
Aussi, il gère les différents caractères trop
Peu de cas qui est passé:
Code
Espoir, ses beaux -
Code est de trouver toutes les sous-chaînes distinctes qui sont palindrome.
Voici le code que j'ai essayé. Il fonctionne très bien.
}
De SORTIE:
Possible de sous-chaînes:
un
b
b
un
ab
bb
ba
abb
bba
abba
Total possible de sous-chaînes sont 10
Total palindromique des sous-chaînes sont 4
Possible palindromique des sous-chaînes: [bb, a, b, abba]
Il a fallu 1 millisecondes
Essayer ce. Sa ma propre solution.