思路:创建两个hash表,统计两个字符串中字符的出现次数,而后对任一字符串遍历,若s中的字符没有在t中出现或者出现了但value相减不等于0,则返回false,否则返回true。
***更新:更优空间复杂度,只需创建一个hash表,在一个for循环中,对map中s的字符所对应的value自加,对t的字符所对应的value自减。而后另起一个遍历,若map中,对于s和t的对应字符的value不为0,则返回false。
小坑:本题两个字符串的长度不一定相等。
代码如下:
#include<unordered_map>
using namespace std;
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length())
return false;
int len = s.length();
unordered_map<char,int>map1,map2;
for (int i = 0;i < len;i++)
{
++map1[s[i]];
++map2[t[i]];
}
for (int i = 0;i < len;i++)
{
if(map2.find(s[i]) == map2.end())
return false;
else
{
if (map1[s[i]] - map2[s[i]] != 0)
return false;
}
}
return true;
}
};
更新后代码(只用一个hash表):
#include<unordered_map>
using namespace std;
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length())
return false;
int len = s.length();
unordered_map<char,int>map1;
for (int i = 0;i < len;i++)
{
++map1[s[i]];
--map1[t[i]];
}
for (int i = 0;i < len;i++)
{
if (map1[s[i]] !=0 || map1[t[i]] !=0 )
return false;
}
return true;
}
};