如何查找在文件中给出的单词之间的字谜

时间:2011-10-25 22:34:09

标签: string algorithm sorting

如何查找文件中给出的单词之间的字谜。

我的解决方案:

对它们进行排序,然后找到重复项。

O(n mlgm)。 n:单词数,m:单词的最大大小

有更好的解决方案吗?

感谢

5 个答案:

答案 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中完成)。这是一种非常简单的方法。

http://imgur.com/a/eqwZ6

基本上你带上字符串列表并将每个字符串反汇编成字母。你拿每个&#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']