一、题目
原题地址:242. 有效的字母异位词
二、题解
方法一:排序
1.思路及算法
t
是s
的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串s
和t
分别排序,看排序后的字符串是否相等即可判断。此外,如果s
和t
的长度不同,t
必然不是s
的异位词。
2.代码
/**
* @author : lightupworld
* @description: leetcode-cn.com/problems/valid-anagram/solution/you-xiao-de-zi-mu-yi-wei-ci-by-leetcode-solution/
* @date 2021/5/21 19:45
*/
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
return Arrays.equals(str1, str2);
}
3.复杂度分析
4.注意事项
- ①字符串常用排序方法
1. 字符串转字符 Char[] ch = s.toCharArray(); 2.排序 Arrays.sort(ch);
方法二:哈希表
1.思路及算法
- 创建一个
map
遍历s
,记录字符 和 对应出现的次数, 出现一次 ++,再去遍历t
,记录出现字符 和次数,出现相容的就-1
,最后遍历map
如果value
有为1
的那就说明不是异位词。 - 使用hashmap 即使出现unicode也能解决问题。
2.代码
public static boolean isAnagram(String s, String t) {
if( s == null || t == null || s.length() != t.length() || s.length() == 0 || t.length() == 0 ) {
return false;
}
Map<Character, Integer> hashMap = new HashMap<>();
Arrays.sort(s.toCharArray());
//遍历s map存储
for (int i = 0; i < s.length(); i++) {
Integer cnt = hashMap.get(s.charAt(i));
cnt = cnt == null ? 1 : ++cnt;
hashMap.put(s.charAt(i), cnt);
}
//遍历t
for (int i = 0; i < t.length(); i++) {
Integer cnt = hashMap.get(t.charAt(i));
cnt = cnt == null ? 1 : --cnt;
hashMap.put(t.charAt(i), cnt);
if (hashMap.get(t.charAt(i)) < 0) {
return false;
}
}
//遍历map
for (Map.Entry<Character, Integer> entry: hashMap.entrySet()) {
if (entry.getValue() != 0) {
return false;
}
}
return true;
}
优化: 在遍历t的时候,就可以判断map的值,不用最后单独再去遍历一次。
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
Map<Character, Integer> table = new HashMap<Character, Integer>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
table.put(ch, table.getOrDefault(ch, 0) + 1);
}
for (int i = 0; i < t.length(); i++) {
char ch = t.charAt(i);
table.put(ch, table.getOrDefault(ch, 0) - 1);
if (table.get(ch) < 0) { //即使t出现s中没有的,存入map的值会是-1 所以判断 < 0 就可以得到正确结果。
return false;
}
}
return true;
}
3.复杂度分析
-
时间复杂度:O(n),其中 n 为s 的长度。
-
空间复杂度:O(S),其中 S 为字符集大小,此处S=26。
4.注意事项
https://leetcode-cn.com/problems/valid-anagram/solution/you-xiao-de-zi-mu-yi-wei-ci-by-leetcode-solution/