题目链接:LeetCode242:有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 字母异位词指字母相同但排列不同的字符串。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
提示:
1 <= s.length, t.length <= 5 * 10^4s和t仅包含小写字母
进阶:
如果输入字符串包含 Unicode 字符怎么办?你能否调整你的解法来应对这种情况?
解题思路
- 长度检查:如果两个字符串长度不同,直接返回
false。 - 数组方法(仅小写字母):
- 使用长度为 26 的数组
count统计每个字符的出现次数。 - 遍历字符串
s,对每个字符增加计数。 - 遍历字符串
t,对每个字符减少计数:- 如果计数小于 0,说明
t中该字符出现次数多于s中,返回false。
- 如果计数小于 0,说明
- 若遍历完成,则返回
true。
- 使用长度为 26 的数组
- 处理非小写字母(进阶):
- 若在数组方法中遇到非小写字母,切换到 HashMap 方法:
- 使用
HashMap统计s中字符出现次数。 - 遍历
t减少计数:- 若计数小于 0,说明
t中字符出现次数多于s中,返回false。
- 若计数小于 0,说明
- 若遍历完成,返回
true。
- 使用
- 若在数组方法中遇到非小写字母,切换到 HashMap 方法:
代码实现(Java版)🔥点击下载源码
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int[] count = new int[26];
// 遍历字符串s,统计字符出现次数
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c < 'a' || c > 'z') {
return isAnagramWithHashMap(s, t);
}
count[c - 'a']++;
}
// 遍历字符串t,减少字符计数
for (int i = 0; i < t.length(); i++) {
char c = t.charAt(i);
if (c < 'a' || c > 'z') {
return isAnagramWithHashMap(s, t);
}
int index = c - 'a';
count[index]--;
if (count[index] < 0) {
return false;
}
}
return true;
}
private boolean isAnagramWithHashMap(String s, String t) {
Map<Character, Integer> map = new HashMap<>();
// 统计s中字符出现次数
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
map.put(c, map.getOrDefault(c, 0) + 1);
}
// 减少t中字符计数,并检查是否出现负数
for (int i = 0; i < t.length(); i++) {
char c = t.charAt(i);
int currentCount = map.getOrDefault(c, 0) - 1;
if (currentCount < 0) {
return false;
}
map.put(c, currentCount);
}
return true;
}
}
代码说明
- 长度检查:首先比较
s和t的长度,不同则直接返回false。 - 数组方法:
- 创建长度为 26 的数组
count,对应 26 个小写字母。 - 遍历
s:- 遇到非小写字母时,调用
isAnagramWithHashMap方法。 - 否则,将字符转换为索引(
c - 'a'),增加计数。
- 遇到非小写字母时,调用
- 遍历
t:- 遇到非小写字母时,调用
isAnagramWithHashMap方法。 - 否则,减少对应字符的计数,若计数小于 0,返回
false。
- 遇到非小写字母时,调用
- 若遍历完成,返回
true。
- 创建长度为 26 的数组
- HashMap 方法:
- 使用
HashMap统计s中字符出现次数。 - 遍历
t:- 减少字符计数,若计数小于 0(
t中字符多于s中),返回false。
- 减少字符计数,若计数小于 0(
- 若遍历完成,返回
true。
- 使用
提交详情(执行用时、内存消耗)

1128

被折叠的 条评论
为什么被折叠?



