刷刷刷Day6|242.有效的字母异位词
242.有效的字母异位词
LeetCode题目要求
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
解题思路
- HashMap 记录字符出现次数解法,首先通过 HashMap 记录字符串 s 各个字符出现的次数,再遍历字符串 t 字符时,出现一个字符,就从 HashMap 减去一次,如果减去后的次数小于 0 或字符直接不存在,那么就说明不是异位词
上代码,HashMap 解法
class Solution {
public boolean isAnagram(String s, String t) {
// 若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词
// 根据题目要求,可以通过对 s 中的字符计数,并与 t 的字符计数对比数量,如果各个字符数完全相等,
// 那么认为是异位词
if (s.length() != t.length()) {
return false;
}
Map<Character, Integer> countMap = new HashMap<>();
char[] ss = s.toCharArray();
for (char c : ss) {
if (countMap.containsKey(c)) {
countMap.put(c, countMap.get(c) + 1);
} else {
countMap.put(c, 1);
}
}
char[] ts = t.toCharArray();
for (char c : ts) {
if (countMap.containsKey(c)) {
int count = countMap.get(c);
if (count - 1 < 0) {
return false;
} else {
countMap.put(c, count - 1);
}
} else {
return false;
}
}
return true;
}
}
- 数组解法,定义 26 长度的 int 数组,数组中首先记录的是从索引 0~26 的每个字符出现的次数,然后根据另一个字符串将出现的次数减去。如果最终数组元素值都等于 0 ,说明是异位词。相比使用 HashMap 来说节省了空间及操作时间
上代码
class Solution {
public boolean isAnagram(String s, String t) {
int[] counter = new int[26];
// 遍历字符串 s, 记录字符出现的次数
for (int i = 0; i < s.length(); i++) {
counter[s.charAt(i) - 'a']++;
}
// 遍历字符串 t
for (int i = 0; i < t.length(); i++) {
counter[t.charAt(i) - 'a']--;
}
for (int i = 0; i < counter.length; i++) {
if (counter[i] != 0) {
return false;
}
}
return true;
}
}
重难点
附:学习资料链接