7

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

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

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

4

10 回答 10

22

将所有字母按字母顺序放入字符串中(排序算法),然后比较结果字符串。

于 2009-02-06T20:54:56.610 回答
10

幸好我们都生活在 C# 现实中,即在内存溢出的四核机器上对短词进行就地排序。:-)

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

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

于 2009-02-06T21:30:04.607 回答
6

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

于 2009-02-06T20:54:51.230 回答
3

有趣的是,Eric Lippert 的 Fabulous Adventures In Coding Blog在 2009 年 2 月 4 日的这篇文章中处理了这个问题的一个变体。

于 2009-02-06T21:02:00.420 回答
2

以下算法应该有效:

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

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

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

于 2009-02-06T20:57:15.560 回答
2

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

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

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

于 2012-04-28T01:57:49.827 回答
1

对字母进行排序和比较(逐个字母、字符串比较……)是首先想到的事情。

于 2009-02-06T20:55:42.443 回答
0
  1. 比较长度(如果不相等,则不是机会)
  2. 制作字符串长度的位向量
  3. 对于第一个字符串中的每个char,在第二个字符串中找到它的出现
  4. 为第一次未设置的事件设置位
  5. 如果你能找到一站失败
于 2009-02-18T08:10:41.170 回答
0
public static void main(String[] args) {

    String s= "abc";
    String s1="cba";



     char[] aArr = s.toLowerCase().toCharArray(); 
     char[] bArr = s1.toLowerCase().toCharArray();

  // An array to hold the number of occurrences of each character
  int[] counts = new int[26]; 

  for (int i = 0; i < aArr.length; i++){
   counts[aArr[i]-97]++;  // Increment the count of the character at respective position
   counts[bArr[i]-97]--;  // Decrement the count of the character at respective position
  }

  // If the strings are anagrams, then counts array will be full of zeros not otherwise
  for (int i = 0; i<26; i++){
   if (counts[i] != 0)
    return false;
  } 
于 2015-11-19T12:21:16.017 回答
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);
    }
于 2017-04-11T07:05:16.017 回答