Des tests répétés de caractères dans une chaîne
Je suis en train de faire un certain travail avec des cordes, et j'ai un scénario où j'en ai besoin pour déterminer si une chaîne de caractères (généralement un petit < 10 caractères) contient des caractères répétés.
`ABCDE` //does not contain repeats
`AABCD` //does contain repeats, ie A is repeated
Je peux faire une boucle par la chaîne.ToCharArray() et test de chaque personnage à l'encontre de tous les autres caractères char[], mais j'ai l'impression de rater quelque chose d'évident.... peut-être que j'ai juste besoin de café. Quelqu'un peut-il aider?
EDIT:
La chaîne seront triés, de sorte que l'ordre n'est pas important, de sorte ABCDA => AABCD
La fréquence de répétition est également important, donc j'ai besoin de savoir si la répétition est la paire ou de triplets, etc.
Quelle est la version de cadre?
Framework version 3.5
OriginalL'auteur inspite | 2009-05-06
Vous devez vous connecter pour publier un commentaire.
Si la chaîne est courte, alors juste les boucles et les tests pourrait bien être la plus simple et la plus efficace. Je veux dire que vous pourrait créer un hachage jeu (quelle que soit la plateforme que vous utilisez) et parcourir les personnages, à défaut, si le personnage est déjà dans le jeu et de l'ajouter à l'ensemble, d'ailleurs, mais c'est seulement susceptible de fournir toute prestation lorsque les chaînes sont plus.
EDIT: Maintenant que nous savons qu'il est trié, mquander réponse est le meilleur de l'OMI. Voici une mise en œuvre:
Une courte alternative si vous n'avez pas l'esprit en répétant l'indexeur utilisation:
EDIT: Bon, avec la "fréquence" de côté, je vais tourner le problème ronde un peu. Je vais quand même à supposer que la chaîne est triée, de sorte que ce que nous voulons savoir, c'est la longueur du plus long terme. Quand il n'y a pas de répétitions, la plus longue longueur sera de 0 (pour une chaîne vide) ou 1 (pour une chaîne non vide). Sinon, ça va être 2 ou plus.
D'abord une chaîne de caractères spécifique à la version:
Maintenant, nous pouvons aussi le faire comme une extension générale de la méthode sur
IEnumerable<T>
:Ensuite, vous pouvez appeler
"AABCD".LongestRun()
par exemple.Et j'ai pensé que vous étiez un LINQ évangéliste 😛
Je suis un fan de LINQ où c'est approprié. Dans ce cas, je ne pense pas que c'est.
Je n'ai pas fouillé dans la MSIL pour vérifier, mais mon hypothèse est que le compilateur d'optimiser le LINQ to similaires, comme la boucle. Pouvez-vous expliquer pourquoi vous pensez que c'est plus approprié? Je pense que votre avis sur ce qui serait très utile.
N'avait pas repéré la fréquence bit. Éditerai quand j'ai le temps.
OriginalL'auteur Jon Skeet
Si la chaîne est triée, vous avez juste à se souvenir de chaque personnage à son tour, et assurez-vous que le caractère suivant est jamais identique au dernier caractère.
D'autres que, pour les chaînes de moins de dix caractères, l'analyse de chaque personnage contre tout le reste est probablement aussi rapide ou plus rapide que la plupart des autres choses. Un vecteur de bits, comme suggéré par un autre intervenant, peut être plus rapide (aide si vous avez un petit ensemble de caractères juridiques.)
Bonus: voici une nappe de LINQ solution à mettre en œuvre de Jon fonctionnalités:
Alors, OK, c'est pas très rapide! Tu as un problème avec ça?!
🙂
C'est vrai, mais s'il est à même de poser cette question, je suppose que la performance est importante.
OriginalL'auteur mquander
Cela va vous dire très rapidement si une chaîne contient des doublons:
Il vérifie juste le nombre de caractères distincts à l'encontre de la longueur d'origine. Si ils sont différents, vous avez des doublons...
Edit: je suppose que cela ne prend pas soin de la fréquence de dup vous avez noté dans votre modifier si... mais quelques autres suggestions ici déjà prendre soin de cela, donc je ne vais pas poster le code que je note un certain nombre d'entre eux vous donnent déjà une assez élégant. J'aime particulièrement Joe est mise en œuvre à l'aide de LINQ extensions.
Merci, j'ai mis à jour mon code en conséquence
OriginalL'auteur BenAlabaster
Depuis que vous utilisez 3.5, vous pouvez le faire en une seule requête LINQ:
Pour chaque personnage qui apparaît plus d'une fois dans l'entrée, ce qui vous donnera le caractère et le nombre des événements.
L'OP voulait savoir où les lettres ont été répétées, ainsi que le nombre d'occurrences, d'où ma solution ci-dessus.
comme indiqué dans la Fpo modifier, cela prend en charge les fréquences qui plus courte, la solution ne serait probablement pas.
+1 belle solution, comme je l'ai noté dans le mien, tant que vous n'avez pas besoin de fréquences, il devient encore plus simple.
bien qu'il travaille pour cette solution, vous devriez être en sélection.g.Clé, pas la g.(Première)
OriginalL'auteur Winston Smith
Je pense que la façon la plus simple d'y parvenir est d'utiliser cette simple regex
Si vous avez besoin de plus d'informations sur le match (début, durée, etc)
OriginalL'auteur xrost
Mise à jour Maintenant, vous aurez besoin d'un tableau de compteurs afin de maintenir un décompte.
Garder un tableau de bits, un bit qui représente un caractère unique. Tournez le peu sur, lorsque vous rencontrez un personnage, et de courir sur la chaîne une fois. Une cartographie du tableau de bits d'index et le jeu de caractères est à vous de décider. Pause si vous en voyez un bit est déjà.
Si c'est pas trop demander, quelqu'un pourrait-veuillez fournir une implémentation de cette?
La question a déjà été traité et cette réponse ne fonctionne plus, comme il n'est pas possible d'obtenir la fréquence de doublons de cette façon.
OriginalL'auteur dirkgently
Comment au sujet de quelque chose comme:
OriginalL'auteur CasperT
(ou quelque soit l'équivalent se trouve dans votre bibliothèque regex de la syntaxe)
Pas le plus efficace, car il sera probablement revenir en arrière à chaque caractère dans la chaîne, puis analyse de l'avant à nouveau. Et je n'ai pas l'habitude de défenseur des expressions régulières. Mais si vous voulez brièveté...
OriginalL'auteur Steve Jessop
J'ai commencé à chercher des infos sur le net et je suis arrivé à la solution suivante.
J'espère que cela aide, j'ai eu un entretien d'embauche dans lequel l'enquêteur m'a demandé de résoudre cela et je comprends qu'il s'agit d'une question commune.
OriginalL'auteur BlackPauler
Quand il n'y a pas d'ordre à travailler sur vous pouvez utiliser un dictionnaire pour garder le compte:
OriginalL'auteur Davy Landman
Le hachage solution Jon a été décrit est probablement le meilleur. Vous pouvez utiliser un HybridDictionary depuis qui fonctionne bien avec de petits et de grands ensembles de données. Lorsque la lettre est la clé et la valeur de la fréquence. (Mise à jour de la fréquence à chaque fois que l'ajout d'échec ou de la HybridDictionary renvoie la valeur true .Contient(key))
OriginalL'auteur Paul U