242. 有效的字母异位词
题目概述
给定两个字符串 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. 哈希表
-
先判断两字符串是否相等
-
如果不等,则字符出现次数必定不同
-
如果相等,则先将其中的一个字符串的字符加入到哈希表,并记录次数
-
遍历另一个字符串的字符,同时判断哈希表中是否有相同的字符
-
如果没有相同的字符,则不为有效的字母异位词
-
如果有相同的字符,则自减次数,同时判断是否减至0
-
如果减到0,则移除对应的字符
-
如果没有减到零,则遍历继续
-
成功遍历字符串则说明两个字符串为字母异位词
代码实现:
public boolean isAnagram_1(String s, String t) {
Map<Character,Integer> hashMap = new HashMap<>(26);
if(s.length() != t.length()){
return false;
}
else{
for(Character character : s.toCharArray()){
hashMap.put(character,hashMap.getOrDefault(character,0) + 1);
}
for(Character character : t.toCharArray()){
Integer count = hashMap.get(character);
if(count == null){
return false;
}else if(count > 1){
hashMap.put(character,--count);
}else{
hashMap.remove(character);
}
}
return true;
}
}
复杂度分析:
- 时间复杂度:O(n), n为s的长度
- 空间复杂度:O(S), S为字符集大小
2.数组
-
同哈希表前两个步骤
-
建立一个容量为26的数组
-
假设从数组的第0位开始为字母a,第1位为字母b,以该规律约定数组
-
遍历第一个字符串,出现一个字符,则将数组对应的字母位置自增
-
遍历第二个字符串,出现一个字符,则将数组对应的字母位置自减
-
若数组对应的字母位置小于0,则返回false
-
成功遍历第二个字符串后,返回true
代码实现:
public boolean isAnagram_2(String s, String t){
int[] counts = new int[26];
int length_s = s.length();
int length_t = t.length();
char[] chars_s = s.toCharArray();
char[] chars_t = t.toCharArray();
if(length_s != length_t){
return false;
}
for(int i = 0; i < length_s; i++){
counts[chars_s[i] - 'a']++;
}
for(int i = 0; i < length_t; i++){
counts[chars_t[i] - 'a']--;
if(counts[chars_t[i] - 'a'] < 0){
return false;
}
}
return true;
}
复杂度分析:
- 时间复杂度:O(n), n为s的长度
- 空间复杂度:O(S), S为字符集大小
3.排序
- 先排序
- 按照顺序同时遍历两个数组,判断字符完全是否一致
- 如果不同,则返回false
- 如果相同,则返回true
代码实现:
public boolean isAnagram_3(String s, String t){
int length_s = s.length();
int length_t = t.length();
if(length_s != length_t){
return false;
}
char[] chars_s = s.toCharArray();
char[] chars_t = t.toCharArray();
Arrays.sort(chars_s);
Arrays.sort(chars_t);
return Arrays.equals(chars_s,chars_t);
}
复杂度分析:
- 时间复杂度:O(nlog n), n为s的长度
- 空间复杂度:O(log n), S为字符集大小
1461

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



