题目描述
给定两个字符串 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 *
-
s
和 t
仅包含小写字母
进阶
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
题目分析
这道题是一道字符串相关的题目,可以创建一个数组,遍历字符串统计并保存各个字符出现的次数,但这一次我们还是使用哈希表的方法来解决这道题。首先考虑特殊情况,就是字符串长度不相等的情况,直接返回 false
即可。我们创建一个哈希表,首先遍历字符串 s
,获取每一个字符并将其作为 key
存入哈希表, value
是对应 key
出现的次数。然后我们再遍历字符串 t
,获取每一个字符并将其作为 key
,在哈希表中更新其对应的 value
值,将其 value
值减一,判断更新后的 value
值是否已经为负数,如果为负数则证明当前 key
在 t
中出现的次数比在 s
中出现的次数多了,直接返回 false
即可。如果遍历完 t
哈希表中的值都为零,就证明各个字符在 s
和 t
中出现的次数一样多,返回 true
。
题解
执行用时: 15 ms
内存消耗: 41.9 MB
class Solution {
public boolean isAnagram(String s, String t) {
// 字符串长度不同 直接返回 false
if (s.length() != t.length()) {
return false;
}
// 创建一个哈希表
HashMap<Character, Integer> map = new HashMap<>();
// 遍历字符串 s
for (int i = 0; i < s.length(); ++i) {
// 取出当前字符
char c = s.charAt(i);
// 放入哈希表 value 是出现的次数
map.put(c, map.getOrDefault(c, 0) + 1);
}
// 遍历字符串 t
for (int i = 0; i < t.length(); ++i) {
// 取出当前字符
char c = t.charAt(i);
// 更新哈希表 将出现的字符统计次数减去一
map.put(c, map.getOrDefault(c, 0) - 1);
// 如果当前字符出现次数为负数
// 证明当前字符在 t 中已经比在 s 中多了
if (map.get(c) < 0) {
// 返回 false
return false;
}
}
// 次数一致返回 true
return true;
}
}
题目来源:力扣(LeetCode)