看见题目首先想到的就是双哈希表再遍历查值。代码如下:
public boolean isAnagram(String s, String t) {
Map hashMap=new HashMap<Character,Integer>();
Map hashMap1=new HashMap<Character,Integer>();
int n=s.length(),n1=t.length();
if(n!=n1){return false;}
for (int i = 0; i < n; i++) {
Character a=s.charAt(i);
Character b=t.charAt(i);
int num=(Integer)hashMap.getOrDefault(a,0)+1;
int num1=(Integer)hashMap1.getOrDefault(b,0)+1;
hashMap.put(a,num);
hashMap1.put(b,num1);
}
for (int i = 0; i <n ; i++) {
Character a=s.charAt(i);
if(!hashMap.get(a).equals(hashMap1.get(a))){
return false;
}
}
return true;
}
通过了但是时间和空间消耗都很高。
看了官方题解,发现可以优化一下,不用创建另一个哈希表,只需在第二次循环中,哈希表的key如果与t的字符相等就将对应的value值减一,就可以实现数据对比。
提高了一点时间和空间利用率O(∩_∩)O。
public boolean isAnagram(String s, String t) {
Map hashMap=new HashMap<Character,Integer>();
int n=s.length(),n1=t.length();
if(n!=n1){return false;}
for (int i = 0; i < n; i++) {
Character a=s.charAt(i);
Character b=t.charAt(i);
int num=(Integer)hashMap.getOrDefault(a,0)+1;
hashMap.put(a,num);
}
for (int i = 0; i <n ; i++) {
Character a=t.charAt(i);
int num=(Integer)hashMap.getOrDefault(a,0)-1;
if(num<0){
return false;
}
hashMap.put(a,num);
}
return true;
}