2016-07-08 18 views
-5

Anagram是一個由另一個字組成的字,它重新排列字母,所有的原始字母只用一次;例如,管絃樂隊可以重新組合成爲carthorse。函數Anagram

我想寫一個函數以任何順序返回給定單詞(包括單詞本身)的所有字母。

例如GetAllAnagrams("abba")應返回包含"aabb", "abab", "abba", "baab", "baba", "bbaa"的集合。

任何幫助,將不勝感激。

+0

使用Nuget包Combinatorics:https://www.nuget.org/packages/Combinatorics/ - 但這些都不是單詞,如果你想要實際的「anagrams」,你也需要一本詞典 –

+3

向我們顯示你的代碼。 – Lennart

+0

懇請@ IanMercer的評論,你的符號有點偏離。一個「單詞」通常不僅僅是字母的任何組合,而是特定地只有在特定語言(或任何語言)中具有含義的組合。問這個問題的一個更好的方法是'列出可以使用輸入字符創建的所有唯一字符串的集合',這是我在下面提供的解決方案所做的。 – Ehryk

回答

1

這裏是一個工作的功能,使得GetPermutations的使用()擴展發現elsewhere on stack overflow

public static List<string> GetAnagrams(string word) 
{ 
    HashSet<string> anagrams = new HashSet<string>(); 
    char[] characters = word.ToCharArray(); 

    foreach (IEnumerable<char> permutation in characters.GetPermutations()) 
    { 
     anagrams.Add(new String(permutation.ToArray())); 
    } 

    return anagrams.OrderBy(x => x).ToList(); 
} 

這裏是GetPermutations()擴展和它的其他必要的擴展:

public static IEnumerable<IEnumerable<T>> GetPermutations<T>(this IEnumerable<T> enumerable) 
    { 
     var array = enumerable as T[] ?? enumerable.ToArray(); 

     var factorials = Enumerable.Range(0, array.Length + 1) 
      .Select(Factorial) 
      .ToArray(); 

     for (var i = 0L; i < factorials[array.Length]; i++) 
     { 
      var sequence = GenerateSequence(i, array.Length - 1, factorials); 

      yield return GeneratePermutation(array, sequence); 
     } 
    } 

    private static IEnumerable<T> GeneratePermutation<T>(T[] array, IReadOnlyList<int> sequence) 
    { 
     var clone = (T[])array.Clone(); 

     for (int i = 0; i < clone.Length - 1; i++) 
     { 
      Swap(ref clone[i], ref clone[i + sequence[i]]); 
     } 

     return clone; 
    } 

    private static int[] GenerateSequence(long number, int size, IReadOnlyList<long> factorials) 
    { 
     var sequence = new int[size]; 

     for (var j = 0; j < sequence.Length; j++) 
     { 
      var facto = factorials[sequence.Length - j]; 

      sequence[j] = (int)(number/facto); 
      number = (int)(number % facto); 
     } 

     return sequence; 
    } 

    static void Swap<T>(ref T a, ref T b) 
    { 
     T temp = a; 
     a = b; 
     b = temp; 
    } 

    private static long Factorial(int n) 
    { 
     long result = n; 

     for (int i = 1; i < n; i++) 
     { 
      result = result * i; 
     } 

     return result; 
    } 
} 

這裏是一個結果屏幕截圖:

GetAnagrams - abba

最後,完整的Visual Studio解決方案的GitHub的庫:Github

-1
import java.util.Scanner; 

import java.lang.String; 

public class KrishaAnagram 

{ 
public static void main(String[] args) { 
    Scanner Scan = new Scanner(System.in); 
    String s1, s2; 
    int sum1, sum2; 

    sum1 = sum2 = 0; 

    System.out.print("Enter fisrt string: "); 
    s1 = Scan.next(); 
    System.out.print("Enter Second string: "); 
    s2 = Scan.next(); 

    if (s1.length() != s2.length()) { 
    System.out.println("NOT ANAGRAM"); 
    } else { 
    for (int i = 0; i < s1.length(); i++) { 
    char ch1 = s1.charAt(i); 
    char ch2 = s2.charAt(i); 
    sum1 += (int) ch1; 
    sum2 += (int) ch2; 
    } 
    if (sum1 == sum2) 
    System.out.println("IT IS AN ANAGRAM : s1 = " + sum1 + "s1 = " + sum2); 
    else 
    System.out.println("IT IS NOT AN ANAGRAM : s1 = " + sum1 + "s1 = " + sum2);; 
    } 
} 
} 

//這是我在Java解決字謎的方式,希望它能幫助。