Quel est le meilleur algorithme pour savoir si une anagramme est un palindrome?
Dans ce problème, nous considérons uniquement les chaînes de bas-de-casse anglais, les lettres (a-z).
Une chaîne est un palindrome si elle a exactement la même séquence de caractères lors de la traversée de gauche à droite comme de droite à gauche. Par exemple, les chaînes de caractères suivantes sont des palindromes:
"kayak"
"codilitytilidoc"
"neveroddoreven"
Une chaîne de caractères est un anagramme d'une chaîne B si elle consiste exactement les mêmes caractères, mais peut-être dans un autre ordre. Par exemple, les chaînes de caractères suivantes sont des anagrammes:
A="marie", B="armée" A="rocketboys" B="octobersky" A="codility" B="codility"
Écrire une fonction
int isAnagramOfPalindrome(String S);
qui retourne 1 si la chaîne s est un anagramme de certains palindrome, ou retourne 0 sinon.
Par exemple, votre fonction doit retourner 1 pour l'argument "dooernedeevrvn", parce que c'est un anagramme d'un palindrome "neveroddoreven". Pour l'argument "aabcba", votre fonction doit retourner 0.
- Que devrait-il retourner si l'argument est correctement formé palendrome, par exemple isAnagramOfPalendrome("neveroddoreven") ? (Je l'ai fait le test ce matin et fini par écrire du code supplémentaire de sorte qu'il est rentré faux pour autre chose qu'un mal formés palendrome. [donc neveroddoreven=false, neverevenorodd=true, neverpalendrome=faux])
- C'est une question (verbatim) donné aux candidats à l'emploi sur codility.com. Triche pour une entrevue d'emploi. Nice! Il n'y a même pas une tentative de suppression de la "codilitytilidoc" de la question. Je recommande d'avoir la question retiré de la SORTE, si une telle chose est possible.
- Codility semblent comme l'émission de demandes de retrait DMCA, et l'ont fait au moins une fois pour une question similaire sur DONC. Ainsi, vous pouvez ainsi obtenir de vos souhaits. Cela dit, je soupçonne que leur jeu de DMCA whack-a-mole est finalement futile: même un coup d', la recherche trouve plusieurs autres doublons de cette question, et ils ne sont pas tous des copies intégrales de la sous copyright interview de texte de la question.
Vous devez vous connecter pour publier un commentaire.
"Algorithme" serait un trop grand mot pour elle.
Vous pouvez construire un palindrome à partir du jeu de caractères donné si chaque personnage se produit dans ce même nombre de fois (avec l'exception possible d'un seul caractère).
Pour n'importe quel autre jeu, vous pouvez facilement montrer qu'aucun palindrome existe.
La preuve est simple dans les deux cas, mais laissez-moi savoir si ce n'était pas clair.
Dans un palindrome, chaque personnage doit avoir une copie de lui-même, un "jumeau", de l'autre côté de la chaîne, sauf dans le cas de la lettre du milieu, qui peut agir comme son propre jumeau.
L'algorithme de vous demander, serait de créer une longueur de 26 tableau, un pour chaque lettre minuscule, et commencer à compter les caractères dans la chaîne, en plaçant la quantité de caractère
n
à l'indexn
de la matrice. Ensuite, il passera à travers le tableau et compter le nombre de caractères avec une quantité impaire (parce qu'une lettre, il n'y a pas une à lits jumeaux). Si ce nombre est 0 ou 1, le lieu unique étrange lettre dans le centre, et un palindrome est facilement généré. Sinon, il est impossible de générer un, parce que de deux lettres ou plus avec aucun des jumeaux existent, et ils ne peuvent pas à la fois être dans le centre.J'ai trouvé cette solution pour le Javascript.
Cette solution est basée sur la prémisse qu'une chaîne de caractères est un anagramme d'un palindrome si et seulement si un personnage apparaît un nombre impair de fois en elle.
j'ai écrit ce code en java. je ne pense pas que si sa va être un bon ^^,
Algorithme:
Compter le nombre d'occurrence de chaque personnage.
Un seul personnage étrange événement est autorisé depuis un palindrome le nombre maximum de caractère, avec une occurrence étrange peut-être à '1'.
Tous les autres caractères doivent se produire dans un même nombre de fois.
Si (2) et (3) ne parviennent pas, alors la chaîne n'est pas un palindrome.
Ceci s'ajoute aux autres réponses. Nous voulons garder une trace du nombre de chaque lettre visible. Si nous avons plus d'un nombre impair pour une lettre alors nous ne serons pas en mesure de la forme d'un palindrome. Le nombre impair, irait dans le milieu, mais seulement un nombre impair peut le faire.
Nous pouvons utiliser une table de hachage pour garder une trace des comtes. La recherche pour une table de hachage est O(1) donc c'est rapide. Nous sommes en mesure d'exécuter l'ensemble de l'algorithme en O(n). Voici, il est dans le code:
J'ai une solution élégante dans PHP posté dans cette question sur les complexités.
Il utilise intégré dans les fonctions de PHP (pourquoi pas), mais vous pouvez le faire vous-même, comme ces fonctions sont assez simples. Tout d'abord, le
count_chars
fonction génère un tableau (dictionnaire en python) avec tous les personnages qui apparaissent dans la chaîne, et leur nombre d'occurrences. Il peut être substitué avec une fonction personnalisée, comme ceci:Puis, un
array_filter
avec uncount
fonction est appliquée à compter combien de caractères ont un nombre impair d'occurrences:Et puis vous venez de demander la comparaison dans la
return
(expliqué dans les commentaires de la fonction d'origine).Cela s'exécute en O(n). Pour tous les caractères, mais l'un, doit être même. l'option bizarre peut être n'importe quel nombre impair.
par exemple
abababa
Vous suffit de compter toutes les lettres et vérifier si il y a des lettres avec odd compte. Si il y a plus d'une lettre avec odd compte la chaîne de ne pas satisfaire à ces palindrome condition.
En outre, depuis une chaîne de caractères avec un même nombre de lettres ne doit pas avoir une lettre avec un nombre impair, il n'est pas nécessaire de vérifier si la longueur de la chaîne est la même ou pas. Il faudra O(n) complexité temporelle:
Voici la mise en œuvre dans
javascript
:Tout droit - il a été un moment, mais comme je l'ai été invité à une telle question dans une entrevue d'emploi j'ai besoin de l'essayer en quelques lignes de Python. L'idée de base est que si il y a un anagramme qui est un palindrome pour le même nombre de lettres de chaque personnage se produit deux fois (ou quelque chose comme 2n fois, c'est à dire nombre%nombre % 2==0). En outre, pour un nombre impair de caractères, un caractère (celui du milieu) peut se produire qu'une seule fois (ou un nombre impair - nombre%nombre % 2==1).
J'ai utilisé un jeu en python pour obtenir les caractères uniques et puis il suffit de compter et de briser la boucle une fois que la condition ne peut être remplie. Exemple de code (Python3):
Alors que vous pouvez détecter que la chaîne "S" est un candidat palindrome aide des techniques, il n'est pas encore très utile. Selon les implémentations donné,
isAnagramOfPalindrome("ssir") serait de retour vrai, mais il n'y a pas de réelle palindrome parce que:
Un palindrome est un mot, une phrase, un nombre, ou une autre séquence de symboles ou éléments, dont le sens peut être interprété de la même façon dans les deux vers l'avant ou vers l'arrière. (Wikipédia)
Et Rser ou Srr est pas un mot ou une phrase qui est interprétable. Même avec son anagramme. Aarrdd n'est pas un anagramme de radar, car il n'est pas interprétable.
Donc, les solutions doivent être augmentée avec une heuristique de contre-vérifier l'entrée pour voir si c'est encore un mot, puis une vérification (via les implémentations donné), qu'il est palindrome-mesure à tous. Puis il y a une heuristique de recherche à travers le collectées seaux avec n/2! les permutations de rechercher si ceux-ci sont en FAIT des palindromes et ne sont pas des déchets. La recherche est seulement n/2! et pas n! parce que vous calculer toutes les permutations de répétition pour chaque lettre, et puis vous miroir de personnes de plus (en plus d'ajouter éventuellement le singulier pivot lettre) pour créer tous les possibles palindromes.
Je suis en désaccord que l'algorithme est trop grand d'un mot, parce que cette recherche peut être faite pur, de manière récursive, ou à l'aide de la programmation dynamique (dans le cas des mots avec des lettres avec des occurrences supérieur à 2) et est non trivial.
codilitytilidoc
est certainement pas un intelligible mot/la phrase. Il me semble qu'ils ne se soucient pas si c'est une réelle mot, de sorte que les ans les réponses sont à la fin.Voici un peu de code: C'est la même que la réponse sommet, qui décrit l'algorithme.