问题描述
完全不用理会自定义哈希函数。在任何平台上都可以使用普通的字符串哈希函数。重要的是使哈希表的关键字具有“已排序单词”的概念-单词按字母排序,因此“ car” =>“ acr”。所有字谜都有相同的“分类词”。
只需从“分类词”到“该分类词的词列表”中添加一个哈希即可。在LINQ中,这非常简单:
using System;
using System.Collections.Generic;
using System.Linq;
class FindAnagrams
{
static void Main(string[] args)
{
var lookup = args.ToLookup(word => SortLetters(word));
foreach (var entry in lookup)
{
foreach (var word in entry)
{
Console.Write(word);
Console.Write(" ");
}
Console.WriteLine();
}
}
static string SortLetters(string original)
{
char[] letters = original.tochararray();
Array.sort(letters);
return new string(letters);
}
}
样品使用:
c:\Users\Jon\Test>FindAnagrams.exe man car kile arc none like
man
car arc
kile like
none
解决方法
给定一组单词,我们需要找到字谜单词并使用最佳算法单独显示每个类别。
输入:
man car kile arc none like
输出:
man
car arc
kile like
none
我现在正在开发的最佳解决方案是基于哈希表,但是我正在考虑将字谜词转换为整数值的方程式。
示例:man =>’m’+’a’+’n’,但这不会给出唯一值。
有什么建议吗?
请参见C#中的以下代码:
string line = Console.ReadLine();
string []words=line.Split(' ');
int[] numbers = GetUniqueInts(words);
for (int i = 0; i < words.Length; i++)
{
if (table.ContainsKey(numbers[i]))
{
table[numbers[i]] = table[numbers[i]].Append(words[i]);
}
else
{
table.Add(numbers[i],new StringBuilder(words[i]));
}
}
问题是如何开发GetUniqueInts(string [])
方法。