Comment pouvez vérifier l'anagramme de chaînes de caractères en C#
Donné deux chaînes A et B, de vérifier si elles sont des anagrammes.
Deux chaînes sont dit être des anagrammes, si une chaîne de caractères peut être obtenu par la réorganisation des lettres de l'autre.
Exemples d'anagrammes sont
dog, god
abac, baac
123, 312
abab, aaba
et dab, baad
ne sont pas des anagrammes.
D'ENTRÉE :
Première ligne de l'entrée est le nombre de cas de test T.
Elle est suivie par T de lignes, chaque ligne a deux séparés par des espaces, les chaînes A et B;
SORTIE
Pour chaque cas de test, d'impression "OUI", si elles sont des anagrammes, sinon d'impression "NON". (sans les guillemets)
Contraintes
- 1 <= T <= 10
- A et B les deux contiennent uniquement en minuscule latine des lettres de 'a' à 'z' et
chiffres de 0 à 9. - Longueur de chaque chaîne A et B ne dépasse pas 5*10^5 (500000)
`
Sample Input Sample Output
------------------------------------
3 YES
abcd bcda NO
bad daa YES
a1b2c3 abc123 NO
Comment pouvons-nous faire cela ?
bool anagramChecker(string first, string second)
{
if(first.Length != second.Length)
return false;
if(first == second)
return true;//or false: Don't know whether a string counts as an anagram of itself
Dictionary<char, int> pool = new Dictionary<char, int>();
foreach(char element in first.ToCharArray()) //fill the dictionary with that available chars and count them up
{
if(pool.ContainsKey(element))
pool[element]++;
else
pool.Add(element, 1);
}
foreach(char element in second.ToCharArray()) //take them out again
{
if(!pool.ContainsKey(element)) //if a char isn't there at all; we're out
return false;
if(--pool[element] == 0) //if a count is less than zero after decrement; we're out
pool.Remove(element);
}
return pool.Count == 0;
}
si ce code ne fonctionne pas??
Voir Besoin d'aide en expansion sur une anagramme regex.
Tricheur méthode est de les trier et de comparer les séquences obtenues.
Voir Anagrammes à Rosettacode.org.
Honnêtement, je pense que votre solution est meilleure que celles proposées ci-dessous.
Voir Besoin d'aide en expansion sur une anagramme regex.
Tricheur méthode est de les trier et de comparer les séquences obtenues.
Voir Anagrammes à Rosettacode.org.
Honnêtement, je pense que votre solution est meilleure que celles proposées ci-dessous.
OriginalL'auteur smartechno | 2015-09-25
Vous devez vous connecter pour publier un commentaire.
Est-ce la solution?
ou plus courte
Concis mais pas très efficace? (O n n log?)
Non, ce n'est pas sa solution et sa solution, c'est mieux.
Vous pouvez faire la même chose encore plus courte: var isAnagram = un.OrderBy(c => c).SequenceEqual b.OrderBy(c => c));
croyez-moi, il va manger la performance
OriginalL'auteur Thomas Krojer
À l'aide de certains LINQ, vérifier si la concaténation des chaînes de caractères contient tout
char
où les comtes dans les deux chaînes différentes..NET violon
Sinon, regardez cette SORTE de question et ses réponses ou liée à non spécifique à une langue sujet pour obtenir plus de C# anagramme de code de vérification.
OriginalL'auteur schnaader
Il y a la voie rapide et de la manière la plus simple:
OriginalL'auteur Kvam
OriginalL'auteur Sumodh S
Une autre façon est de vérifier si la première contient un char à l'intérieur de la deuxième. retirez ensuite que le char de la première jusqu'à ce que pas plus de caractères à gauche.
Noter que le
List<T>.Remove()
méthode qui retourne une valeur booléenne qui spécifie si la méthode a été en mesure de supprimer quoi que ce soit ou pas.Vous pouvez faire tout cela en une seule ligne de Linq.
La méthode Linq
All<char>(Func<char,bool>)
va effectuer le délégué jusqu'à ce que leFunc<char,bool>
retourne la valeur false ou jusqu'à la fin de la requête. si la touche Func return false alorsAll
retourne false trop. sinon, il retournera true.OriginalL'auteur M.kazem Akhgary
Ce qui semble aller beaucoup plus vite que le Linq versions.
OriginalL'auteur Pluto
Cette solution permettra de vérifier anagramme pour exactement 1 pass (O(Cn) où C = 1)
OriginalL'auteur Andrey
Pour la casse, vous pouvez essayer ceci:
OriginalL'auteur Mallikarjun Biradar
Si vous avez une contrainte de temps limitée, c'est mieux/solution efficace:
OriginalL'auteur Umair M
O(n) Solution
OriginalL'auteur Jamil Omar Falconi Aguirre