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/
答案 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))
和true
为a
,b
时,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;
}