Comment puis-je vérifier si une chaîne a les mêmes caractères? Python
J'ai besoin d'être en mesure de discerner si une chaîne de caractères d'une longueur arbitraire, supérieur à 1 (et uniquement en minuscules), a le même jeu de caractères à l'intérieur d'une base ou d'un modèle de chaîne de caractères.
Prenez, par exemple, la chaîne "aabc": "azbc" et "aaabc" serait fausse, alors que "acba" serait vrai.
Est-il un moyen rapide de le faire en python, sans garder la trace de toutes les permutations de la première chaîne, puis en les comparant à la chaîne de test?
Est-ce grave si il y a des répétitions? Comment
Qui serait fausse, je vais modifier ma question.
La création de toutes les permutations peut être plus rapide si vous testez beaucoup de valeurs par rapport à la même clé. Il vous en coûtera beaucoup de mémoire supplémentaire si.
C'est un peu trompeur de parler de "jeux" lors de la répétition des questions.
Stocker les permutations dans un comprimé trie ou d'un hachage de l'arbre au lieu d'une table de hachage pourrait être un compromis intéressant.
aaaaaaabc
comparer?Qui serait fausse, je vais modifier ma question.
La création de toutes les permutations peut être plus rapide si vous testez beaucoup de valeurs par rapport à la même clé. Il vous en coûtera beaucoup de mémoire supplémentaire si.
C'est un peu trompeur de parler de "jeux" lors de la répétition des questions.
Stocker les permutations dans un comprimé trie ou d'un hachage de l'arbre au lieu d'une table de hachage pourrait être un compromis intéressant.
OriginalL'auteur Monte Carlo | 2013-08-20
Vous devez vous connecter pour publier un commentaire.
Trier les deux chaînes et de les comparer:
Si les chaînes de caractères peuvent ne pas être de la même longueur, vous pouvez vous assurer que pour gagner du temps:
str1 == str2 or sorted(str1) == sorted(str2)
); je ne vais pas la peine d'ajouter de la complexité à moins que vous savez que c'est un goulot d'étranglement et vous savez quelque chose sur les données.Je ne note que c'est vrai seulement si les deux ne sont pas de la même longueur. Si les chaînes sont longues, il serait probablement gagner du temps, même si seule une minorité ne sont pas égaux.
Merci beaucoup, j'ai du nouveau, il doit y avoir un moyen plus intuitif que de faire toutes les combinaisons possibles, et la vérification de chaque permutation au modèle ou à la chaîne de test.
Bien sûr, il serait probablement gagner du temps, mais si le gain de temps n'a pas d'importance, il n'en vaut pas la complexité ajoutée.
OriginalL'auteur David Robinson
C'est le
O(n)
solutionMais la
O(n * log n)
solution à l'aide desorted
est probablement plus rapide pour mieux les valeurs den
oui
Counter
est assez lent pour ce que c'est, mais ensuite, il y a moins de chance pour les bugs, il est donc nécessaire de trouver un compromis. Peut-être que quelqu'un va optimiser mieux un jourOriginalL'auteur John La Rooy
Voici une variation sur @Joowani solution qui n'utilise qu'un dictionnaire et va encore plus vite (du moins sur ma machine) :
OriginalL'auteur lmjohns3
Voici un autre O(n) solution, plus longue mais légèrement plus vite que les autres:
Il se fait de la même chose que gnibber de la solution (mais pour des raisons étranges les Counter() à partir des collections de la bibliothèque semble assez lent). Voici quelques timeit résultats:
Aussi, la solution de David qui vient de sortir sur le dessus quand la chaîne sont de petites tailles et en fait ils ont les mêmes caractères.
EDIT: mis à jour les résultats de l'essai
d, d2 = dict.from_keys(str1), dict.from_keys(str2)
Ensuite, vous n'aurez pas à faire lain
test dans la boucleOriginalL'auteur Joohwan
Heres une autre manière. En utilisant ce que nous ignorons la plupart des "ensembles":
OriginalL'auteur anarcky