题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例1
输入: s = "anagram", t = "nagaram"
输出: true
示例2
输入: s = "rat", t = "car"
输出: false
方法一:排序
算法思想
t 是 s 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 s 和 t 分别排序,看排序后的字符串是否相等即可判断。此外,如果 s 和 t 的长度不同,t 必然不是 s 的异位词。
JAVA代码
class Solution {
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);
}
}
注意
String 中 str1==str2 比较两个对象的引用地址是否相同,str1.equals(str2) 比较两个对象字符串的内容是否相同(String 类中重写了 equals() 方法用于比较两个字符串的内容是否相等)。
字符串中 str1==str2 和 str1.equals(str2) 均用于比较字符串的引用地址是否相同,若要比较字符串的内容是否相同,应该用Arrays.equals(str1,str2) 函数
复杂度分析
时间复杂度:O(nlogn),其中 n 为 s 的长度。排序的时间复杂度为 O(nlogn),比较两个字符串是否相等时间复杂度为 O(n),因此总体时间复杂度为 O(nlogn+n)=O(nlogn)。
空间复杂度:O(logn)。排序需要 O(logn) 的空间复杂度。
方法二:哈希表
算法思想
t 是 s 的异位词等价于**「两个字符串中字符出现的种类和次数均相等」**。由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 table,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 tt,减去table 中对应的频次,如果出现 table[i]<0,则说明 t 包含一个不在 s 中的额外字符,返回false 即可。
JAVA代码1
class Solution {
public boolean isAnagram(String s, String t) {
char[] table = new char[26];
for (int i = 0; i < s.length(); ++i) {
table[s.charAt(i) - 'a']++;
}
// for (int i = 0; i < t.length(); ++i) {
// table[t.charAt(i) - 'a']--;
// }
// for (int i = 0; i < 26; ++i) {
// if (table[i] != 0) {
// return false;
// }
// }
for (int i = 0; i < t.length(); ++i) {
table[t.charAt(i) - 'a']--;
if (table[t.charAt(i) - 'a'] < 0) {
return false;
}
}
return true;
}
}
JAVA代码2
class Solution {
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 index = s.charAt(i);
table.put(index, table.getOrDefault(index, 0) + 1);
}
for (int i = 0; i < t.length(); ++i) {
char index = t.charAt(i);
table.put(index, table.getOrDefault(index, 0) - 1);
if (table.get(index) < 0) {
return false;
}
}
return true;
}
}
复杂度分析
时间复杂度:O(n),假设 n 是s的长度
空间复杂度:O(S),其中S为字符集大小,此处S=26。