查找给定单词的字谜

h4c*_*k3d 39 language-agnostic algorithm anagram data-structures

如果其中一个字符与另一个字的字符完全相同,则两个字是字谜.

示例:Anagram&Nagaram是anagrams(不区分大小写).

现在有很多类似的问题.找出两个字符串是否为字谜的几种方法是:

1) Sort字符串并比较它们.

2)frequency map为这些字符串创建一个并检查它们是否相同.

但是在这种情况下,我们会给出一个词(为了简单起见,我们只假设一个单词,它只有单个单词anagrams),我们需要找到它的字谜.

我想到的解决方案是,我们可以为单词生成所有排列并检查字典中存在哪些单词 .但显然,这是非常低效的.是的,字典也可用.

那么我们有什么替代方案呢?

我也在一个类似的线程中读到可以使用的东西,Tries但是这个人没有解释算法是什么,为什么我们首先使用Trie,只是在Python或Ruby中提供了一个实现.所以这并不是真的有用,这就是我创建这个新线程的原因.如果有人想要分享他们的实现(除了C,C++或Java),那么也要解释它.

Vat*_*ine 72

算法示例:

Open dictionary
Create empty hashmap H
For each word in dictionary:
  Create a key that is the word's letters sorted alphabetically (and forced to one case)
  Add the word to the list of words accessed by the hash key in H
Run Code Online (Sandbox Code Playgroud)

要检查给定单词的所有字谜:

Create a key that is the letters of the word, sorted (and forced to one case)
Look up that key in H
You now have a list of all anagrams
Run Code Online (Sandbox Code Playgroud)

构建速度相对较快,查找速度极快.

  • @mprivat如果你能找到两个字母序列相同而不是彼此字谜的字母,我会很高兴(注意,我们不会丢弃任何字母,"香蕉"的关键字是'aaabnn'并且具有该密钥的任何其他单词必然必须是"香蕉"的字谜. (2认同)

ACV*_*ACV 17

我猜想我想出了一个新的解决方案.它使用算术的基本定理.所以我的想法是使用前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 };
Run Code Online (Sandbox Code Playgroud)

这是方法:

 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 它本质上是另一种创建密钥的方法,该密钥对于彼此为字母的所有单词都是唯一的,即具有相同的字母集.这是一个不错的主意,但更明显的方法是按字母顺序对字母进行排序(或者你想要的,只要它是一致的).例如,字母顺序的关键是aaabcehilllpty.我想知道如果你的方法会产生一个更紧凑的密钥,因此有可能在计算上更有效率. (3认同)
  • 你的确也是个好主意.排序比乘法要贵一点. (2认同)
  • `排序比乘法要好一点.在这种情况下,我认为我更喜欢使用素数的方法.我将进一步研究它. (2认同)