- 这道题,只是考虑了小写字母的情况,所以可以用数组充当hash表的方案。
- 对应进阶要求,字符串包含unicode字符,那么就只能用hash表了
- 先遍历s字符串,将出现的字符作为key,出现一次value值+1,从0开始
- 再遍历t字符串,将出现的字符作为key,出现一次对应value值-1,如果这个字符没有出现过,那么先将其添加到hash表,然后value值置为-1
- 最后统一判断,如果value值!=0,那么必然不符合要求
代码:时间复杂度O(n) 空间复杂度O(S),n是字符串长度,s是字符串包含字符的范围,这道题是26个小写字母,s = 26 |
---|
class Solution {
public boolean isAnagram(String s, String t) {
int[] hash = new int[26];
for (char c : s.toCharArray()) {
hash[c - 'a']++;
}
for (char c : t.toCharArray()) {
hash[c - 'a']--;
}
for (int num : hash) {
if (num != 0) return false;
}
return true;
}
public boolean isAnagram1(String s, String t) {
if(s.length() != t.length()) return false;
Map<Character,Integer> table = new HashMap<Character,Integer>();
for(int i = 0;i < s.length();i++){
char ch = s.charAt(i);
table.put(ch,table.getOrDefault(ch,0)+1);
}
for(int i = 0; i < t.length();i++){
char ch = t.charAt(i);
table.put(ch,table.getOrDefault(ch,0)-1);
if(table.get(ch) < 0) return false;
}
return true;
}
}