Vérifier si une chaîne est la rotation de l'autre, SANS la concaténation
Il y a 2 cordes , comment peut-on vérifier si l'on est une version tournée de l'autre ?
For Example : hello --- lohel
Une solution simple est de concatenating
première chaîne avec elle-même et de vérifier si l'autre est un substring
de la concaténation de version.
Est-il une autre solution ?
Je me demandais si nous pouvions utiliser circular linked list
peut-être ? Mais je ne suis pas en mesure de parvenir à la solution.
La vérification des ifm de la deuxième chaîne est une chaîne de la première n'est pas assez - la taille peut être différente. Lors de la deuxième chaîne est supprimée à partir du premier doublé de la chaîne, puis le reste est à l'origine de la première chaîne (dans le cas de la rotation).
OriginalL'auteur h4ck3d | 2012-08-19
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous voulez dire concaténer la première chaîne avec lui-même, puis vérifier si l'autre est une sous-chaîne de la concaténation.
Qui va travailler, et en fait peut être fait sans la concaténation. Juste à l'utiliser tout algorithme de recherche de chaîne de caractères à la recherche de la deuxième chaîne dans le premier, et lorsque vous atteignez la fin, la boucle de retour pour le début.
Par exemple, à l'aide de Boyer-Moore l'ensemble de l'algorithme O(n).
Je ne comprends pas:"recherche de la deuxième chaîne dans le premier, et lorsque vous atteignez la fin, la boucle de retour vers le début". Que pouvons-nous obtenir par la recherche "cdab" dans "abcd" ?
OriginalL'auteur BlueRaja - Danny Pflughoeft
Il n'y a pas besoin de concaténer à tous.
Tout d'abord, vérifiez les longueurs. Si ils sont différents alors retourner faux.
Deuxièmement, l'utilisation d'un index qui s'incrémente à partir du premier caractère de la dernière de la source. Vérifier si la destination commence avec toutes les lettres de l'index à la fin, et se termine avec toutes les lettres avant de l'index. Si, à tout moment, c'est vrai, retourner true.
Sinon, retourne false.
EDIT:
Une implémentation en Python:
C'est à peu près ce que le code de cette réponse ne.
U peut plutôt mettre en place un pseudo-code? Ne sais pas python. @AlexeyFrunze Non, ils sont différents.
Noter que cet algorithme est O(n^2), puisque chaque appel à
startswith
etendswith
est O(n). Il est possible de construire un ensemble O(n) algorithme qui n'est pas beaucoup plus compliqué que cela, cependant.Vrai, mais
str.startswith()
etstr.endswith()
sont mis en œuvre en C, ce qui signifie que leur O(n) est beaucoup plus faible que le coût de découpage (qui peut également être contourné; c'est en fait une assez naïve de l'algorithme).OriginalL'auteur Ignacio Vazquez-Abrams
On peut calculer la lexicographiquement minimale de la chaîne de rotation de chaque chaîne, puis de tester s'ils sont égaux.
Le calcul du mouvement de rotation minimal est de O(n).
Ce serait bien si vous aviez beaucoup de cordes à l'essai, comme le mouvement de rotation minimal pourrait être appliqué comme une étape de prétraitement, et puis vous pouvez utiliser une table de hachage pour stocker la rotation de chaînes.
Jamais l'esprit, c'est dans le lien. Le fait qu'il est possible en O(n) n'est pas entièrement surprenant, mais aussi des non-trivial. Et la seule solution c'est également en O(1) l'espace est hautement non-trivial.
OriginalL'auteur Peter de Rivaz
Trivial O(min(n,m)^2) algorithme: (n - longueur de S1, m - longueur de la S2)
isRotated(S1 , S2):
EDIT:
Explication -
Deux chaînes S1 et S2 de longueur m et n respectivement cycliques sont identiques si et seulement si m == n et existent indice 0 <= j <= n-1 tels S1 = S[j]S[j+1]...S[n-1]S[0]...S[j-1].
Ainsi, dans l'algorithme ci-dessus, nous vérifions si la longueur est égale et s'il existe un tel indice.
Lire le code. Il est trivial.
C'est également faux. Voir Ignacio réponse pour un exemple.
Vrai.
J'ai eu des petites erreur d'index. C'est bien maintenant. Je voulais donner simple pseudo-code au lieu du langage de programmation dépendante de l'algorithme.
OriginalL'auteur barak1412
Une solution très simple est de faire tourner l'un des mots n fois, où n est la longueur du mot. Pour chacune de ces rotations, vérifier pour voir si le résultat est le même que l'autre mot.
Cela dépend de votre langue, mais si vous travaillez dans une langue où vous pouvez faire pivoter avec O(1) travail (par exemple, le simple fait de déplacer le dernier caractère de la fin et en déplaçant le pointeur de la souris vers l'avant par un), puis de faire les rotations serait juste O(n) avec n horribles constantes. Chaque comparaison serait également en O(n), alors vous pourriez être à la recherche en O(n^2), je suppose.
OriginalL'auteur David
Vous pouvez le faire dans
O(n)
temps etO(1)
espace:Voir ma réponse ici pour plus de détails.
OriginalL'auteur Padraic Cunningham
Solution Simple en Java. Pas besoin de l'itération ou la concaténation.
Cas de Test:
Logique:
Prenez la première chaîne du premier caractère, trouver l'index de la deuxième chaîne. Soustraire la longueur de la deuxième avec l'indice trouvé, vérifiez si le premier caractère de la deuxième à 0 est la même que le caractère à la différence de la longueur de la deuxième et de l'indice et des sous-chaînes entre ces 2 personnages sont les mêmes.
O(n)
déjà (et contribue également à la nombre de comparaisons)Et ceci ne fonctionnera pas pour les cas de test comme:
bottle
ettXYbZW
Je ne considère pas indexOf de la mise en œuvre de temps, mauvais. Merci pour vos pensées.
OriginalL'auteur Nikola Despotoski
Un autre python de mise en œuvre (sans concaténation) bien que n'étant pas efficace mais elle est O(n), à la recherche de commentaires, le cas échéant.
Supposer qu'il y a deux chaînes s1 et s2.
Évidemment, si s1 et s2 sont des rotations, il existe deux sous-chaînes de caractères de s2 dans s1, la somme de leur total à la longueur de la chaîne.
La question est de trouver la partition pour laquelle je l'incrément d'indice, s2, chaque fois qu'un char de s2 correspond à celle de s1.
La deuxième et la condition est juste pour s'assurer que le compteur incrémenté pour les s2 sont une sous-chaîne de match.
OriginalL'auteur sysuser
input1= "bonjour" 2="llohe" input3="lohel"(input3 est cas spécial)
si la longueur de l'entrée 1 & 2 ne sont pas un rendement de 0.Soit i et j deux indices pointant vers input1 et input2, respectivement, et initialiser le comte de input1.longueur. Avoir un indicateur appelé isRotated qui est à false
while(compteur != 0){
Lorsque le personnage est de 1 correspond à input2
Si le personnage ne correspondent
Vous trouverez le code ci-dessous et laissez-moi savoir si il échoue pour une autre combinaison que je n'auriez pas pensé.
OriginalL'auteur user1556718
Résoudre le problème en temps O(n)
OriginalL'auteur preeti
OriginalL'auteur ukdaga
Cela peut être fait en O(1) en temps et O(n) de l'espace (C#). Veuillez noter que la recherche se fait en O(1) fois.
Prétraitement de la source de la chaîne de n itérations, où n est la longueur de la source, puis ajouter la clé d'un dictionnaire.
Retourne true si le modèle existe dans le dictionnaire, et false sinon.
Exemple de code:
rotated
. Et c'est plus comme O(n*n) de l'espace, puisque vous êtes le stockage de toutes les circulaires de la rotation d'une chaîne de caractères.OriginalL'auteur yellowcountry