这题乍一看觉得很简单, 但做起来就感觉每个想到的方法都有些问题····
写了个最笨的办法
class Solution {
public:
bool compare(unordered_map<char, int> &m1, unordered_map<char, int> &m2)
{
for (auto pair1 : m1)
{
if (m2.find(pair1.first) == m2.end())
return false;
if (m2.find(pair1.first)->second != pair1.second)
return false;
}
return true;
}
bool isAnagram(string s, string t) {
unordered_map<char, int> m1, m2;
for (auto c : s)
++m1[c];
for (auto c : t)
++m2[c];
bool ans1 = compare(m1, m2);
bool ans2 = compare(m2, m1);
return (ans1 && ans2);
}
};
时间复杂度O(n)
学习 其他解法
没用hash表 但是用了hash表的思想 hash映射 太妙了 我的想法也是这样 但是coding能力不够, 写不出来哭唧唧
思路:
因为没有大写 所以 只会有26个字母, 创建个大小为26的vector, 遍历s,t 通过"哈希函数" s[i] - 'a', 可以映射到vector上, 一个++, 一个--。最后遍历vector 是否每个元素都为0。
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.size() != t.size())
return false;
vector<int> ans(26, 0);
for (int i = 0; i < s.size(); ++i)
{
++ans[s[i] - 'a'];
}
for (int j = 0; j < t.size(); ++j)
{
--ans[t[j] - 'a'];
}
for (int a : ans)
{
if (a != 0)
return false;
}
return true;
}
};