# Description
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.
# My solution
基本思路是利用dict思想, 统计每个单词出现次数, 最后对两次统计的进行对照.
```
class Solution {
public:
bool isAnagram(string s, string t) {
int ds[26] = {0};
int dt[26] = {0};
for (int i = 0; i < s.size(); i++) {
ds[s[i] - 'a']++;
}
for (int i = 0; i < t.size(); i++) {
dt[t[i] - 'a']++;
}
for (int i = 0; i < 26; i++) {
if (ds[i] != dt[i]) return false;
}
return true;
}
};
```
# Discuss
基本思想一致, 但是更节省内存的一种方式. 有点像多数投票问题中的解决方案, 在同一个统计数组++--, 最后判断是否每个位置为0即可.
```
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) return false;
int n = s.length();
int counts[26] = {0};
for (int i = 0; i < n; i++) {
counts[s[i] - 'a']++;
counts[t[i] - 'a']--;
}
for (int i = 0; i < 26; i++)
if (counts[i]) return false;
return true;
}
};
```
注意到c++中map的用法(对比于python dict), 网友的一种方案如下:
```
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) return false;
int n = s.length();
unordered_map<char, int> counts;
for (int i = 0; i < n; i++) {
counts[s[i]]++;
counts[t[i]]--;
}
for (auto count : counts)
if (count.second) return false;
return true;
}
};
```
# Reference
- [leetcode 242](https://leetcode.com/problems/valid-anagram/description/)
- [std::unordered_map](http://www.cplusplus.com/reference/unordered_map/unordered_map/)