题目:有效字母异位词
题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例1
输入: s = “anagram”, t = “nagaram”
输出: true
示例2
输入: s = “rat”, t = “car”
输出: false
解法一:
t 是 ss 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 ss 和 tt 分别排序,看排序后的字符串是否相等即可判断。此外,如果 ss 和 tt 的长度不同,tt 必然不是 ss 的异位词。
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
};
解法二:
从另一个角度考虑,t是 s 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 26个小写字母,因此我们可以维护一个长度为 26的频次数组 table,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去table 中对应的频次,如果出现 table[i]<0,则说明 t 包含一个不在 s中的额外字符,返回false 即可。
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size())
{
return false;
}
vector<int>table(26,0);//初始化
for(auto&ch:s)
{
table[ch-'a']++;
}
for(auto&ch:t)
{
table[ch-'a']--;
}
for(int i=0;i<26;++i)
{
if(table[i]!=0)
{
return false;
}
}
return true;
}
};