【问题标题】:Function Anagram函数字谜
【发布时间】:2016-11-10 14:27:06
【问题描述】:

字谜是由另一个单词通过重新排列其字母而形成的单词,所有原始字母仅使用一次;例如,管弦乐队可以重新排列成carthorse。

我想编写一个函数以任何顺序返回给定单词(包括单词本身)的所有字谜。

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

任何帮助将不胜感激。

【问题讨论】:

  • 使用 Nuget 包组合:nuget.org/packages/Combinatorics - 但这些不是单词,如果你想要真正的“字谜”,你也需要一本字典
  • 向我们展示您的代码。
  • 根据@IanMercer 的评论,您的符号有点偏离。 “单词”通常不仅仅是字母的任何组合,而且特别是在特定语言(或任何语言)中具有意义的组合。提出问题的更好方法是“列出可以使用输入字符生成的所有唯一字符串的集合”,我在下面提供的解决方案就是这样做的。

标签: c# string anagram


【解决方案1】:

这是一个工作函数,使用了 elsewhere on stack overflow 找到的 GetPermutations() 扩展

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

这是结果的截图:

最后,完整的 Visual Studio 解决方案的 github 存储库:Github

【讨论】:

    【解决方案2】:
    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中解字谜的方法,希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 2019-07-27
      • 2014-03-08
      • 2014-12-19
      • 2013-08-10
      • 2021-02-14
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多