2015-03-26 3 views
-2

Мой вопрос: Как вы проверяете, является ли данная строка анаграммой палиндрома?Проверьте, является ли строка анаграммой палиндрома

Я нашел некоторые решения в Python в Интернете, но я не уверен, как это проверить. Я думал о преобразовании strig в char [], а затем получить HashCode для каждого персонажа, но я застрял.

+4

Не могли бы вы привести несколько примеров того, что вы имеете в виду? Например, «abcabc» действителен, поскольку это анаграмма «abccba», хотя ни одна из них не является реальными словами? –

+0

i.e. «Naa» - это анаграмма палиндрома «ana» –

+0

Зачем нужно получать HashCode для каждого символа, а не использовать сам символ? – Saggio

ответ

5

Если вы не заинтересованы в палиндроме или анаграмме, являющемся реальным словом, я думаю, что вы можете пересмотреть проблему как проверить, имеет ли данная строка не более одного символа, который появляется неравномерным количеством раз. Это основано на том, что только средний символ может встречаться нечетным числом раз. Пока это выполняется, вы можете сформировать палиндром из строки.

Для этого вы можете использовать Linq. Возможно, что-то вроде этого:

private static bool IsPalindromeAnagram(string test) 
{ 
    var charCount = test.GroupBy(c => c, (c, i) => new 
     { 
      character = c, 
      count = i.Count() 
     }); 

    return charCount.Count(c => c.count % 2 == 1) <= 1; 
} 
0

Сохраненный символ в словаре в качестве ключа, а затем проверьте, не более одного ключа. этот способ также имеет все уникальные символы, готовые сделать анаграмму.

var length = s.Length; 

     if (length == 0) return false; 

     var dic = new Dictionary<char, int>(); 

     for (var i = 0; i < length; i++) 
     { 

      if (dic.ContainsKey(s[i])) 
      { 
       dic[s[i]]++; 
       continue; 
      } 

      dic.Add(s[i], 1); 
     } 
     int odd = 0; 
     foreach (var pv in dic) 
     { 
      if (odd > 1) return false; 
      if (pv.Value % 2 == 0) 
      { 
       continue; 
      } 
      odd++; 
     } 
Смежные вопросы