题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母
解法:1、采用哈希表的形式
2、数组和哈希映射的结合
3、采用数组,先存储s 和 t 的字符,字符排序,比较字符数组
解法 1 的思路:
用哈希表存储 s 的 每个字符作为键,哈希值默认为0,相同字符哈希值就加 1
然后获取哈希表的每个哈希值的个数,遍历字符串 t 对哈希值进行 减 1,遍历完 t, 当 最后返回。
public boolean isAnagram1(String s, String t) {
Map<Character, Integer> map = new HashMap<>();
for (char ch : s.toCharArray()) {
map.put(ch, map.getOrDefault(ch, 0) + 1);
//getOrDefault(Object key, V defaultValue) 返回指定键映射到的值,
// 如果此映射不包含该键的映射,则返回 defaultValue 。
}
for (char ch : t.toCharArray()) {
Integer count = map.get(ch);
if (count == null) {
return false;
} else if (count > 1) {
map.put(ch, count - 1);
} else {
map.remove(ch);//remove(Object key) 如果存在(从可选的操作),从该地图中删除一个键的映射。
}
}
return map.isEmpty();
解法2 的思路:
标签:哈希映射
首先判断两个字符串长度是否相等,不相等则直接返回 false
若相等,则初始化 26 个字母哈希表,遍历字符串 s 和 t
s 负责在对应位置增加,t 负责在对应位置减少
如果哈希表的值都为 0,则二者是字母异位词
public boolean isAnagram2(String s, String t) {
if (s.length() != t.length())
return false;
int[] alpha = new int[26];
for (int i = 0; i < s.length(); i++) {
alpha[s.charAt(i) - 'a']++;//charAt(int index) 返回指定索引处的 char值。
alpha[t.charAt(i) - 'a']--;
}
for (int i = 0; i < 26; i++)
if (alpha[i] != 0)
return false;
return true;
}
解法3 的思路:
t 是 s 的异位词等价于「两个字符串排序后相等」。 因此我们可以对字符串 s 和 t 分别排序,看排序后的字符串是否相等即可判断。 此外,如果 s 和 t 的长度不同,t 必然不是 s 的异位词。
public boolean isAnagram3(String s, String t) {
if (s.length() != t.length())
return false;
//char[] toCharArray() 将此字符串转换为新的字符数组。
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
//sort(char[] a) 按照数字顺序排列指定的数组。
Arrays.sort(str1);
Arrays.sort(str2);
return Arrays.equals(str1, str2);
}
我这里给出测试:
@Test
public void test() {
String s1 = "anagram";
String t = "nagaram";
boolean b = isAnagram1(s1, t);
System.out.println();
System.out.println("b = " + b);
}
测试结果: