字符串java anagrams

时间:2017-06-10 17:07:04

标签: java anagram

String str="cat";
char[] arr = new char[26];
for(int i=0; i<str.length(); i++){
    arr[str.charAt(i)-'a']++;
}
String ns = new String(arr);

我遇到了这段代码。我怀疑是因为数组arr默认包含\ u0000这是什么增量(arr [str.charAt(i) - &#39; a&#39;] ++;)操作。如何将这个arr转换为字符串ns,其中包含如此多的空值。共享完整代码的链接。代码运行正常。 http://www.programcreek.com/2014/04/leetcode-anagrams-java/

2 个答案:

答案 0 :(得分:0)

代码将输入字符串的字符频率计算为char[]。 而不是int[]。 这听起来违反直觉。 但这导致了一种有效的解决方案,但存在一些局限性。

诀窍是你可以从String相当有效地创建char[], 它会给你String.equals带来的好处。 从char[]创建的包含字符频率的字符串将不具有可读性,但这无关紧要。 这样的字符串可以在哈希表中使用, 如链接代码那样, 因为String.equals有一个适合在哈希表中使用的实现。

相比之下,int[]没有equals的有用实现。 这是因为数组从equals继承了Object的实现, 这不是很有用。 这样做的结果是a.equals(b)会在false时返回a != b,即使它们都包含相同的值。 感谢String.equals, 当new String(a).equals(new String(b))trueab时,char[]将返回a != b,但它们包含相同的值。 此外,无法将int[]转换为适合在哈希映射中使用的速度比new String(char[])快的东西。

限制是如果str包含超过65535次的字符,则算法将不会产生正确的输出。

答案 1 :(得分:0)

试试这个简单的方法

static boolean isAnagram(String a, String b) {
    int aSum = a.toUpperCase().chars().sorted().sum();
    int bSum = b.toUpperCase().chars().sorted().sum();        
    if(aSum == bSum)
        return true;
    else
        return false;
}