题目
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的 字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
思路一:排序
t 是 s 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 s 和 t 分别排序,看排序后的字符串是否相等即可判断。此外,如果 s 和 t 的长度不同,t 必然不是 s 的异位词。
class Solution {
public boolean isAnagram(String s, String t) {
//先判断s和t的长度是否相同
if(s.length() != t.length())return false;
char[] str1 = s.toCharArray();//将s转变为字符数组
char[] str2 = t.toCharArray();
Arrays.sort(str1);//对s进行自动排序
Arrays.sort(str2);
return Arrays.equals(str1,str2);//返回str1和str2是否相等
}
}
思路二:哈希表
从另一个角度考虑,t 是 s 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 table,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去 table 中对应的频次,如果出现 table[i]<0,则说明 t 包含一个不在 s 中的额外字符,返回 false 即可。
class Solution {
public boolean isAnagram(String s, String t) {
//先判断s和t的长度是否相等
if(s.length() != t.length())return false;
//创建哈希表共26个字母
int[] table = new int[26];
//依次将s中的字符存入哈希表中
for(int i = 0;i < s.length();i++){
table[s.charAt(i) - 'a']++;
}
//将t中的对应字符移除
for(int i = 0;i < t.length();i++){
table[t.charAt(i) - 'a']--;
//若哈希表中有负数,则说明不相等
if(table[t.charAt(i) - 'a'] < 0)return false;
}
//否则,相等
return true;
}
}