给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
我们先来看一个错误解法:
class Solution
{
public:
bool isAnagram(string s, string t)
{
int As=0,At=0;
for(char ch:s)
{
As+=ch;
}
for(char ch:t)
{
At+=ch;
}
if(As==At)
{
return true;
}
return false;
}
};
只统计ASCII码的和,必然会出现如"ccbb"与"aadd"的情况。即两个字符串的字符并不相同,但ASCII码之和相同的情况。
几个正确方法:
法一:统计字母的出现次数
由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 cnt,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去cnt中对应的频次,如果出现 cnt[i]!=0,则说明 t 包含一个不在 s 中的额外字符,返回 false 即可。
class Solution
{
public:
bool isAnagram(string s, string t)
{
vector<int>cnt(26,0);
for(char ch:s)
{
cnt[ch-'a']++;
}
for(char ch:t)
{
cnt[ch-'a']--;
}
for(vector<int>::iterator it=cnt.begin();it!=cnt.end();it++)
{
if(*it!=0)
{
return false;
}
}
return true;
}
};
法二:排序
t 是 s 的异位词等价于两个字符串排序后相等。因此我们可以对字符串 s 和 t 分别排序,看排序后的字符串是否相等即可。此外,如果 s 和 t 的长度不同,t 必然不是 s 的异位词。
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;
}
};
法三:键值对
class Solution
{
public:
bool isAnagram(string s, string t)
{
unordered_map<char,int> mp;
if(s.size()!= t.size()) return false;
for(int i = 0; i < s.size(); i++)
{
mp[s[i]]++;
mp[t[i]]--;
}
for(auto i : mp) if(i.second != 0) return false;
return true;
}
};
1166

被折叠的 条评论
为什么被折叠?



