难度简单534
给定两个字符串 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
仅包含小写字母
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
解题思路1:使用两个map来存储s和t字符串中出现的字符次数,用index1 存储字符串 s 出现的字符数,用index2来存储字符串 t 出现的字符数,判断是否为字母异位词时,一是:直接比较index1 和 index2 的长度,长度不相等时直接返回false,二是:比较index1 和 index2 同一个字符出现的次数,当不一样时,return false;如果这两个条件都不满足时,返回true;
class Solution {
public:
bool isAnagram(string s, string t) {
map<char, int> index1;
map<char, int> index2;
for(int i = 0; i < s.size(); i++)
{
if(index1.find(s[i]) == index1.end()){//没找到
index1[s[i]] = 1;
}
else{//找到的处理
index1[s[i]]++;
}
}
for(int i = 0; i < t.size(); i++)
{
if(index2.find(t[i]) == index2.end())//没找到处理
{
index2[t[i]] = 1;
}
else{//找到后处理
index2[t[i]]++;
}
}
if(index1.size() != index2.size()) return false;
map<char, int> ::iterator it;
for(it = index1.begin(); it != index1.end();it++){
int temp = it->second;
if(index2[it->first] != temp)
return false;
}
return true;
}
};
解题思路2:遍历字符串s,统计同一字符出现的次数放入map<char,int> index中,在遍历字符串t时,直接把index中跟s字符相同的字符数 -1;当遍历完成之后,index里所有字符的字符数都是0 时,是字母异位词。
class Solution {
public:
bool isAnagram(string s, string t) {
//s,t长度可能不一样
map<char,int> index;
for(int i = 0; i < s.size(); i++)
{
if(index.find(s[i]) == index.end())//没找到处理
{
index[s[i]] = 1;
}
else{//找到后处理
index[s[i]]++;
}
}
for(int i = 0; i < t.size(); i++)
{
if(index.find(t[i]) == index.end())//没找到处理
{
index[t[i]] = -1;
}
else{//找到后处理
index[t[i]]--;
}
}
map<char,int> ::iterator it;
for(it = index.begin(); it != index.end(); it++)
{
if(it->second != 0)
return false;
}
return true;
}
};