2011-02-03 2 views
-1

Мне нужно ввести код в C#, чтобы проверить, какие слова в данном словаре являются анаграммами друг друга.Как проверить, какие слова являются анаграммами друг друга?

Программе необходимо принять этот массив слов {map, art, tar, pam, why} и выход должен быть map, pam, art, tar.

ответ

0

Проверьте следующий сценарий.

 var inputArr = new string[]{"mapa","art","tra","pam","why"}; 
     var outputList = new List<string>(); 
     for (int i = 0; i < inputArr.Length; i++) 
     { 
      for (int j = i+1; j<inputArr.Length ; j++) 
      {      
       char[] temp1 = inputArr[i].ToLower().ToCharArray(); 
       char[] temp2 = inputArr[j].ToLower().ToCharArray(); 
       if (temp1.Length != temp2.Length) 
        continue; 
       else 
       { 
        bool isAnnograms = true; 
        for (int k1 = 0, k2=temp1.Length-1; k1 < temp1.Length; k1++,k2--) 
        { 
         if (temp1[k1] == temp2[k2]) 
          continue; 
         else 
          isAnnograms = false; 
        } 
        if (isAnnograms) 
        { 
         outputList.Add(new string(temp1)); 
         outputList.Add(new string(temp2)); 
         isAnnograms = false; 
        } 
       } 
      } 
     } 

outputList показывает список Anagram

0

Я думаю, вы могли бы найти this example приведенные в MSDN весьма полезно: это адаптируемое решение LINQ.

0

Word - это анаграмма друг друга, если у нее ТАКОЕ число определенных букв. Вы можете создать карту char-> int и посчитать буквы, а затем сравнить две карты. Если они имеют одинаковые элементы, то эти два слова являются анаграммами.

Или:

Отсортировать символов в каждом слове (к переменной TEMP) в алфавитном порядке, а затем сравните то, что вы получили.

Для домашней работы создайте ОБА алгоритмы!

:)

0

Другой подход будет считать сортировку.

Даны две строки:

foo и oof. Для первой струны:

Dictionary<char, int> occurences = new Dictionary<char, int>(); 

foreach(var c in firstString){ 

    int result; 
    if(occurences.tryGetValue(c, out result)){ 
    result++; 
    } 
    else 
    { 
    occurences.Add(c,0); 
    } 

} 

Теперь вы строите свой счет. Затем вы можете перебирать другую строку и уменьшаться от каждого появления. в конце вы должны иметь элементы своего словаря со значениями 0. Если ключ не находится в словаре, вы возвращаетесь с ошибкой.

4
using System; 

namespace Anagram_Test 
{ 
    class ClassCheckAnagram 
    { 
        public int check_anagram(char[] a, char[] b) 
        { 
            Int16[] first = new Int16[26]; 
            Int16[] second = new Int16[26]; 
            int c = 0; 

            for (c = 0; c < a.Length; c++) 
            { 
                first[a[c] - 'a']++; 
            } 

            c = 0; 

            for (c=0; c<b.Length; c++) 
            { 
                second[b[c] - 'a']++; 
                
            } 

            for (c = 0; c < 26; c++) 
            { 
                if (first[c] != second[c]) 
                    return 0; 
            } 

            return 1; 
        } 
    } 
} 

using System; 

namespace Anagram_Test 
{ 
    class Program 
    { 
        static void Main(string[] args) 
        { 

            ClassCheckAnagram cca = new ClassCheckAnagram(); 
            Console.WriteLine("Enter first string\n"); 
            string aa = Console.ReadLine(); 
            char[] a = aa.ToCharArray(); 

            Console.WriteLine("\nEnter second string\n"); 
            string bb = Console.ReadLine(); 
            char[] b = bb.ToCharArray(); 
            int flag = cca.check_anagram(a, b); 

            if (flag == 1) 
                Console.WriteLine("\nThey are anagrams.\n"); 
            else 
                Console.WriteLine("\nThey are not anagrams.\n"); 
            Console.ReadKey(); 
        } 

    } 
} 

Эта программа показывает, как вы можете проверить, являются ли две заданные строки ввода Анаграммы или нет в языке CSharp. Анаграммы - это два разных слова или комбинации символов, которые имеют одинаковые алфавиты и их количество. Поэтому определенный набор алфавитов может создавать множество перестановок анаграмм. Другими словами, если у нас есть один и тот же набор символов в двух словах (строки), то они являются анаграммами.

Мы создаем функцию, которая вводит в качестве пары входных данных массива символов. Когда мы получаем два разных набора символов, мы проверяем счет каждого алфавита в этих двух наборах. Наконец, мы подсчитываем и проверяем, является ли значение количества символов для каждого алфавита одинаковым или нет в этих наборах. Если все символы встречаются с одинаковой скоростью в обоих наборах символов, тогда мы объявляем, что наборы являются анаграммами, иначе нет.

+0

Это не будет работать для ввода, который содержит капитал символов ASCII и не будет работать для любого входа юникода –

0
/// <summary> 
    /// This solutions works for all unicode string values. 
    /// </summary> 
    /// <remarks>2n time complexity. Dictionary insertion and retrieval will be minimal</remarks> 
    public static bool Anagram(string valueA, string valueB) 
    { 
     if (string.IsNullOrWhiteSpace(valueA) || string.IsNullOrWhiteSpace(valueB)) 
     { 
      return false; 
     } 

     if (valueA.Length != valueB.Length) 
     { 
      return false; 
     } 

     if (valueA.Equals(valueB)) 
     { 
      return false; 
     } 

     var values = new Dictionary<char, int>(); 
     foreach (char key in valueA) 
     { 
      if (!values.ContainsKey(key)) 
      { 
       values[key] = 1; 
      } 
      else 
      { 
       values[key] += 1; 
      } 
     } 

     var uniqueCharacters = values.Keys.Count; 
     for (var i = 0; i < valueB.Length; i++) 
     { 
      char item = valueB[i]; 
      if (!values.ContainsKey(item) || values[item] == 0) 
      { 
       return false; // too many occurances of char found 
      } 

      values[item] -= 1; 
      if (values[item] == 0) 
      { 
       uniqueCharacters -= 1; 

       if (uniqueCharacters == 0) 
       { 
        return i == valueB.Length - 1; 
       } 
      } 
     } 

     return false; 
    } 

     [Test] 
     public void Anagram3Test() 
     { 
      Assert.That(Anagram3(null, null), Is.False); 
      Assert.That(Anagram3(string.Empty, null), Is.False); 
      Assert.That(Anagram3("a", null), Is.False); 

      Assert.That(Anagram3("ab", "ab"), Is.False); 
      Assert.That(Anagram3("carthorses", "orchestra"), Is.False); 
      Assert.That(Anagram3("orchestra", "carthorses"), Is.False); 
      Assert.That(Anagram3("abc", "bce"), Is.False); 

      Assert.That(Anagram3("orchestra", "carthorse"), Is.True); 
     } 
0

Недавно я получил аналогичный вопрос в интервью и подумал, что я брошу свое решение здесь. Этот метод работает с символами Unicode и не чувствителен к регистру. Он не отвечает непосредственно на ваш вопрос, но может использоваться для проверки того, являются ли две строки в массиве анаграммами.

private static bool IsAnagram(String s1, String s2) 
    { 
     if (String.IsNullOrEmpty(s1)) throw new ArgumentNullException("s1"); 
     if (String.IsNullOrEmpty(s2)) throw new ArgumentNullException("s2"); 

     Dictionary<char, int> m1 = new Dictionary<char, int>(); 
     Dictionary<char, int> m2 = new Dictionary<char, int>(); 

     // get the length of the longer string, this is used for the for loop below 
     int length = s1.Length > s2.Length ? s1.Length : s2.Length; 

     // iterate through both strings at the same time 
     // verifies that the index is not out of bounds before checking if the current character is a letter 
     // adds character to dictionary if it doesn't exist and increments count 
     for (int i = 0; i < length; i++) 
     { 
      if (i < s1.Length && Char.IsLetter(s1[i])) 
      { 
       if (!m1.ContainsKey(char.ToLower(s1[i])) m1.Add(char.ToLower(s1[i]), 0); 

       m1[char.ToLower(s1[i])]++; 
      } 

      if (i < s2.Length && Char.IsLetter(s2[i])) 
      { 
       if (!m2.ContainsKey(char.ToLower(s2[i]) m2.Add(char.ToLower(s2[i]), 0); 

       m2[char.ToLower(s2[i])]++; 
      } 
     } 

     // if the two dictionaries don't match in length bail out now 
     if (m1.Count != m2.Count) return false; 

     // uses first dictionary to verify key and value exist in second dictionary 
     foreach (char current in m1.Keys) 
     { 
      if (!m2.ContainsKey(current)) return false; 
      if (m1[current] != m2[current]) return false; 
     } 

     return true; 
    } 
0
public static bool AreStringsAnagrams(string a, string b) 
    { 
     if (string.IsNullOrWhiteSpace(a) || string.IsNullOrWhiteSpace(b) || a.Length != b.Length) 
     { 
      return false; 
     } 

     a = a.ToLower(); 
     b = b.ToLower(); 

     if (a.Equals(b)) 
      return false; 

     char[] ac = a.ToCharArray(); 
     char[] bc = b.ToCharArray(); 
     Array.Sort(ac); 
     Array.Sort(bc); 
     for (int i = 0; i < ac.Length; i++) 
     { 
      if (ac[i] != bc[i]) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 
Смежные вопросы