如何查找文件中给出的单词之间的字谜。
我的解决方案:
对它们进行排序,然后找到重复项。
O(n mlgm)。 n:单词数,m:单词的最大大小
有更好的解决方案吗?
感谢
答案 0 :(得分:9)
这是一个没有排序的解决方案: 我猜想我想出了一个新的解决方案。它使用算术的基本定理。所以我的想法是使用前26个素数的数组。然后对于输入字中的每个字母,我们得到相应的素数A = 2,B = 3,C = 5,D = 7 ......然后我们计算输入字的乘积。接下来,我们对字典中的每个单词执行此操作,如果单词与输入单词匹配,则将其添加到结果列表中。所有字谜都有相同的签名,因为
任何大于1的整数都是素数,或者可以写 作为素数的唯一乘积(忽略顺序)。
这是代码。我将单词转换为大写,65是A的位置,对应于我的第一个素数:
private int[] PRIMES = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31,
37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103,
107, 109, 113 };
这是功能:
private long calculateProduct(char[] letters) {
long result = 1L;
for (char c : letters) {
if (c < 65) {
return -1;
}
int pos = c - 65;
result *= PRIMES[pos];
}
return result;
}
此处提供完整说明: Anagram on dev.vvirlan.com
答案 1 :(得分:6)
使用在单词的排列下不变的散列函数来散列所有单词,例如,计算每个字母的频率计数并散列该数组。将它们放在哈希表中并查找散列到相同值的条目(当然,由于哈希表的性质,您仍然必须测试这些冲突是否是实际的字谜)。
那应该在O(n)时间内运行,假设你选择了一个好的哈希函数并且你的输入集不包含太多的字谜(在最坏的情况下,如果每个单词都是每个其他单词的一个字谜,则运行于O(n 2 )时间。
答案 2 :(得分:0)
更好的解决方案:假设单词的平均长度较小。如有必要,请咨询当地语言专家。然后应用你想到的算法;如果它是我想到的那个,它将在数学上预期线性时间性能,在单词数。
答案 3 :(得分:0)
这是一个古老的主题,但我会发布它,万一有人偶然发现:
我已经对谷歌电子表格中完成的过程进行了描述(也可以在excel中完成)。这是一种非常简单的方法。
基本上你带上字符串列表并将每个字符串反汇编成字母。你拿每个&#34;字母包&#34;并按字母顺序排序。组装成单词,但字母按字母顺序排序。按照汇编的#34;单词&#34;排序 - 所有的字谜彼此相邻。制作一个简单的公式来标记字谜。
答案 4 :(得分:0)
# list of words
words = ["ROOPA","TABU","OOPAR","BUTA","BUAT" , "PAROO","Soudipta",
"Kheyali Park", "Tollygaunge", "AROOP","Love","AOORP",
"Protijayi","Paikpara","dipSouta","Shyambazaar",
"jayiProti", "North Calcutta", "Sovabazaar"]
#Method 1
A = [''.join(sorted(word)) for word in words]
dict ={}
for indexofsamewords,samewords in enumerate(A):
dict.setdefault(samewords, []).append(indexofsamewords)
print(dict)
#{'AOOPR': [0, 2, 5, 9, 11], 'ABTU': [1, 3, 4], 'Sadioptu': [6, 14], ' KPaaehiklry': [7], 'Taeggllnouy': [8], 'Leov': [10], 'Paiijorty': [12, 16], 'Paaaikpr': [13], 'Saaaabhmryz': [15], ' CNaachlortttu': [17], 'Saaaaborvz': [18]}
for index in dict.values():
print( [words[i] for i in index ] )
输出:
['ROOPA', 'OOPAR', 'PAROO', 'AROOP', 'AOORP']
['TABU', 'BUTA', 'BUAT']
['Soudipta', 'dipSouta']
['Kheyali Park']
['Tollygaunge']
['Love']
['Protijayi', 'jayiProti']
['Paikpara']
['Shyambazaar']
['North Calcutta']
['Sovabazaar']