你如何列出彼此字谜的单词?
当我申请当前的工作时,我被问到了这个问题。
orchestra
可以重新排列为carthorse
,所有原始字母只使用一次,因此这些字词是彼此的字谜。
答案 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)
以下算法应该有效:
对每个单词中的字母进行排序。
对每个列表中已排序的字母列表进行排序。
比较每个列表中的每个元素是否相等。
答案 5 :(得分:2)
对列表中的单词进行排序。
如果abc,bca,cab,cba是输入,那么排序列表将是abc,abc,abc,abc。
现在他们所有的哈希代码都是相同的。比较HashCodes。
答案 6 :(得分:1)
对字母进行排序并比较(逐字母,字符串比较,......)是我想到的第一件事。
答案 7 :(得分:0)
char
,在第二个答案 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);
}