给定两个字符串 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.计算字符串的差值
- 先统计字符串s中每个字符的数量
- 减去t中每个字符对应的数量
class Solution {
public boolean isAnagram(String s, String t) {
int count[]=new int[26];
for(int i=0;i<s.length();i++){
count[s.charAt(i)-'a']++;
}
for(int j=0;j<t.length();j++){
count[t.charAt(j)-'a']--;
}
for(int num:count){
if(num!=0){
return false;
}
}
return true;
}
}
优化:
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length()!=t.length())
return false;
int count[]=new int[26];
for(int i=0;i<s.length();i++){
count[s.charAt(i)-'a']++;
}
for(int j=0;j<t.length();j++){
if(count[t.charAt(j)-'a']==0)
return false;
count[t.charAt(j)-'a']--;
}
return true;
}
}
2.先排序,再比较
先把两个字符串转化为字符数组,然后再对这两个字符数组进行排序,因为相同的字符在排序之后肯定是挨着的,最后再比较这两个排序后的数组的元素是否相同。
class Solution {
public boolean isAnagram(String s, String t) {
char[] sChar = s.toCharArray();
char[] tChar = t.toCharArray();
//对两个字符串中的字符进行排序
Arrays.sort(sChar);
Arrays.sort(tChar);
return Arrays.equals(sChar, tChar);
}
}
3.一次遍历
使用一个变量count记录新出现字符的个数,然后同时遍历两个数组,如果出现了一个新的字符,count就加1,如果消失了一个字符,count就减1,最后判断count是否等于0即可。
class Solution {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length())
return false;
char[] cs = s.toCharArray();
char[] ct = t.toCharArray();
int[] map = new int[26];
int count = 0;
for (int i = 0; i < cs.length; i++) {
//出现了一个新的字符
if (++map[cs[i] - 'a'] == 1) {
count++;
}
//消失了一个新的字符
if (--map[ct[i] - 'a'] == 0) {
count--;
}
}
return count == 0;
}
}