什么是一种简单的方法来判断一个单词列表是否是彼此的字谜?

时间:2009-02-06 20:52:32

标签: string language-agnostic anagram

你如何列出彼此字谜的单词?

当我申请当前的工作时,我被问到了这个问题。

orchestra可以重新排列为carthorse,所有原始字母只使用一次,因此这些字词是彼此的字谜。

10 个答案:

答案 0 :(得分:22)

将所有字母按字母顺序排列在字符串中(排序算法),然后比较生成的字符串。

- 亚当

答案 1 :(得分:10)

我们都生活在C#现实中,在具有oozles内存的四核机器上就短字进行就地排序。 : - )

但是,如果您恰好受内存限制并且无法触及原始数据,并且您知道这些单词包含来自ASCII表格下半部分的字符,那么您可以使用不同的算法来计算每个单词的出现次数。每个单词中的字母而不是排序。

如果您想在O(N)中执行此操作并且不关心内存使用情况,也可以选择该算法(每个Unicode字符的计数器都非常昂贵)。

答案 2 :(得分:6)

对每个元素进行排序(删除空格)并与之前的元素进行比较。如果它们都是相同的,它们都是字谜。

答案 3 :(得分:3)

有趣的是,Eric Lippert's Fabulous Adventures In Coding Blog于2009年2月4日在this post处理了这个问题的变体。

答案 4 :(得分:2)

以下算法应该有效:

  1. 对每个单词中的字母进行排序。

  2. 对每个列表中已排序的字母列表进行排序。

  3. 比较每个列表中的每个元素是否相等。

答案 5 :(得分:2)

对列表中的单词进行排序。

如果abc,bca,cab,cba是输入,那么排序列表将是abc,abc,abc,abc。

现在他们所有的哈希代码都是相同的。比较HashCodes。

答案 6 :(得分:1)

对字母进行排序并比较(逐字母,字符串比较,......)是我想到的第一件事。

答案 7 :(得分:0)

  1. 比较长度(如果不相等,不是偶然)
  2. 制作字符串长度的位向量
  3. 对于第一个字符串中的每个char,在第二个
  4. 中查找它的出现次数
  5. 设置第一次未设置的位
  6. 如果你能找到一站失败

答案 8 :(得分:0)

{{1}}

答案 9 :(得分:0)

为anagram尝试哈希码逻辑给了我错误的输出

public static Boolean anagramLogic(String s,String s2){
    char[] ch1 = s.toLowerCase().toCharArray();
        Arrays.sort(ch1);
        char[] ch2= s2.toLowerCase().toCharArray();
        Arrays.sort(ch2);
        return ch1.toString().hashCode()==ch2.toString().hashCode(); //wrong
    }

要纠正此代码,下面是我看到的唯一选项,感谢任何建议

char[] ch1 = s.toLowerCase().toCharArray();
        Arrays.sort(ch1);
        char[] ch2= s2.toLowerCase().toCharArray();
        Arrays.sort(ch2);
        return Arrays.equals(ch1,ch2);
    }