2016-07-08 11 views
-5

アナグラムは、すべての元の文字を正確に1回使用して、その文字を並べ替えて別の単語から形成された単語です。例えば、オーケストラはカートホースに再配置することができる。機能アナグラム

任意の単語(単語自体を含む)のすべてのアナグラムを任意の順序で返す関数を作成したいと思います。

たとえば、GetAllAnagrams("abba")は、"aabb", "abab", "abba", "baab", "baba", "bbaa"を含むコレクションを返す必要があります。

ご協力いただければ幸いです。

はここ
+0

Nugetパッケージのコンビナトリアルを使用してください:https://www.nuget.org/packages/Combinatorics/ - しかしそれらは言葉ではありませんが、実際の "アナグラム"が必要な場合は辞書も必要です –

+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; 
    } 
} 

はAです結果のスクリーンショット:

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でアナグラムを解決するための私の方法ですが、それがお役に立てば幸いです。