https://leetcode.com/problems/valid-anagram/
Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return false.
Note:
You may assume the string contains only lowercase alphabets.
Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?
class Solution {
public:
bool isAnagram(string s, string t) {
map<char, int> ms;
map<char, int> mt;
//统计s中的单词频率
for (int i = 0; i < s.size(); i++){
if (ms.find(s[i]) == ms.end())
ms.insert(pair<char, int> (s[i], 1));
else
ms[s[i]]++;
}
//统计t中的单词频率
for (int i = 0; i<t.size(); i++){
if (mt.find(t[i]) == mt.end())
mt.insert(pair<char, int> (t[i], 1));
else
mt[t[i]]++;
}
if (mt.size() != ms.size())
return false;
for (map<char, int>::iterator iters = ms.begin(), itert = mt.begin(); iters != ms.end() && itert != mt.end(); iters++, itert++){
if (iters->first != itert->first || iters->first == itert->first && iters->second != itert->second){
return false;
}
}
return true;
}
};
改进1.1:首先即比较s、t长度是否相等(112ms)
添加:
if(s.size()!=t.size())
return false;
改进1.2:两个map,首先将'a'—'z'均对应0,再统计s、t中各字母次数,再比较(64ms)
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size())
return false;
map<char, int> ms;
map<char, int> mt;
for(char ch = 'a';ch<='z';ch++){
ms[ch] = 0;
mt[ch] = 0;
}
//统计s中的单词频率
for (int i = 0; i < s.size(); i++){
ms[s[i]]++;
}
//统计t中的单词频率
for (int i = 0; i<t.size(); i++){
mt[t[i]]++;
}
if (mt.size() != ms.size())
return false;
for (map<char, int>::iterator iters = ms.begin(), itert = mt.begin(); iters != ms.end() && itert != mt.end(); iters++, itert++){
if (iters->second != itert->second){
return false;
}
}
return true;
}
};
改进1.3:一个map,对s中各字母++,对t中各字母--,比较最后是否有非0(64ms)
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size())
return false;
map<char, int> m;
int len = s.size();
for (int i = 0; i < len; i++){
m[s[i]]++;
m[t[i]]--;
}
for (map<char, int>::iterator iters = m.begin(); iters != m.end(); iters++){
if (iters->second != 0){
return false;
}
}
return true;
}
};
2、两次排序,直接比较排序后的两字符串是否相等(76ms)
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size())
return false;
sort(s.begin(),s.end());
sort(t.begin(),t.end());
return s==t;
}
};
3、一个hash表,各字母转换成数字,次数保存在对应下标中,同样对s中++,对t中--,看最后是否有非0元素(12ms)
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size())
return false;
int hash[26] = {0};
int len = s.size();
for (int i = 0; i < len; i++){
hash[s[i]-'a']++;
hash[t[i]-'a']--;
}
for (int i = 0;i<26;i++){
if(hash[i]!=0)
return false;
}
return true;
}
};