Anagram是一個由另一個字組成的字,它重新排列字母,所有的原始字母只用一次;例如,管絃樂隊可以重新組合成爲carthorse。函數Anagram
我想寫一個函數以任何順序返回給定單詞(包括單詞本身)的所有字母。
例如GetAllAnagrams("abba")
應返回包含"aabb", "abab", "abba", "baab", "baba", "bbaa"
的集合。
任何幫助,將不勝感激。
Anagram是一個由另一個字組成的字,它重新排列字母,所有的原始字母只用一次;例如,管絃樂隊可以重新組合成爲carthorse。函數Anagram
我想寫一個函數以任何順序返回給定單詞(包括單詞本身)的所有字母。
例如GetAllAnagrams("abba")
應返回包含"aabb", "abab", "abba", "baab", "baba", "bbaa"
的集合。
任何幫助,將不勝感激。
這裏是一個工作的功能,使得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;
}
}
這裏是一個結果屏幕截圖:
最後,完整的Visual Studio解決方案的GitHub的庫:Github
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解決字謎的方式,希望它能幫助。
使用Nuget包Combinatorics:https://www.nuget.org/packages/Combinatorics/ - 但這些都不是單詞,如果你想要實際的「anagrams」,你也需要一本詞典 –
向我們顯示你的代碼。 – Lennart
懇請@ IanMercer的評論,你的符號有點偏離。一個「單詞」通常不僅僅是字母的任何組合,而是特定地只有在特定語言(或任何語言)中具有含義的組合。問這個問題的一個更好的方法是'列出可以使用輸入字符創建的所有唯一字符串的集合',這是我在下面提供的解決方案所做的。 – Ehryk