题目描述
解法
解法都是别人的,做一个搬运解法的搬运工。
解法一
如果 s 和 t 的长度不同,t 必然不是 s 的异位词。
t 是 s 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 s 和 t 分别排序,看排序后的字符串是否相等即可判断。
class Solution {
public boolean isAnagram(String s, String t) {
//如果s和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); //Arrays.equals可以判断两个字符数组是否相等
}
解法二
哈希表法
t 是 s 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 sum,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去 sum 中对应的频次,如果出现sum[t[j] - ‘a’] < 0 ,则说明 t 包含一个不在 s 中的额外字符,返回 false 即可。
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int sum[] = new int[26]; //定义一个26长度的数组分别存储s中出现的字母的个数
//将s和t转化为字符串数组
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
for (int i = 0; i < s.length(); i++) {
sum[str1[i] - 'a'] ++;
}
for (int j = 0; j < t.length(); j++) {
sum[str2[j] - 'a'] --;
if (sum[str2[j] - 'a'] < 0) {
return false;
}
}
return true;
}
}
当然也可以不把s和t转化为字符数组
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int sum[] = new int[26]; //定义一个26长度的数组分别存储s中出现的字母的个数
for (int i = 0; i < s.length(); i++) {
sum[s.charAt(i) - 'a'] ++;
}
for (int j = 0; j < t.length(); j++) {
sum[t.charAt(j) - 'a'] --;
if (sum[t.charAt(j) - 'a'] < 0) {
return false;
}
}
return true;
}
}