42.有效的字母异位词
题目
要求
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
思路
这道题目脑海中的第一个想法就是使用哈希来解决,key 为字符串中的每一个字母,值为字母出现的次数,遍历第一个字符串字母出现了就加一,遍历第二个字符串字母就减一,代码如下:
public boolean isAnagram(String s, String t) {
Map<Character, Integer> map = new HashMap<>();
if (s.length() != t.length()) {
return false;
}
char[] sCharArray = s.toCharArray();
for (char c : sCharArray) {
map.put(c, map.getOrDefault(c, 0) + 1);
}
char[] tCharArray = t.toCharArray();
for (char c : tCharArray) {
map.put(c, map.getOrDefault(c, 0) - 1);
}
for (Integer value : map.values()) {
if (value != 0) {
return false;
}
}
return true;
}
第二个思路不容易想到,要根据提示来,提示是只包含小写字母,那我可以直接声明一个 26 长的数组,这样相对于哈希来说,少了一个 get 操作,思路都是一样,代码如下:
public boolean isAnagram(String s, String t) {
int[] arr = new int[26];
if (s.length() != t.length()) {
return false;
}
char[] sCharArray = s.toCharArray();
for (char c : sCharArray) {
arr[c - 97] ++;
}
char[] tCharArray = t.toCharArray();
for (char c : tCharArray) {
arr[c - 97] --;
}
for (int i : arr) {
if (i != 0) {
return false;
}
}
return true;
}