Valid Anagram
题目链接:https://leetcode.com/problems/valid-anagram/
题目大意:就是判断两个字符串是否由相同的字符组成(字符个数也要相同)
1)排序方法
将字符串进行排序以后,如果想等,即可
代码如下:
class Solution { public: bool isAnagram(string s, string t) { string s_t = s; string t_t = t; sort(s_t.begin(), s_t.end()); sort(t_t.begin(), t_t.end()); if(s_t == t_t) { return true; } return false; } };
2)hash方法
先统计第一个字符串中各个字符出现的次数,然后再遍历第二个字符串,相同则hash表中的次数减1,最后判断hash表中是否所有字符出现次数均为0
代码如下:
class Solution { public: bool isAnagram(string s, string t) { int n = s.size(); int m = t.size(); map<char, int> maps; for(int i=0; i<n; ++i) { if(maps.find(s[i]) == maps.end()) { maps.insert(make_pair(s[i], 1)); } else { maps[s[i]]++; } } for(int i=0; i<m; ++i) { if(maps.find(t[i]) == maps.end()) { return false; } maps[t[i]]--; if(maps[t[i]] < 0) { return false; } } map<char, int>::iterator it = maps.begin(); for(; it!=maps.end(); ++it) { if(it->second != 0) { return false; } } return true; } };
也可以直接用数组来代替map,运行时间上会快一些,代码如下:
class Solution { public: bool isAnagram(string s, string t) { vector<int> maps(26, 0); for(int i=0; i<s.size(); ++i) { maps[s[i]-'a']++; } for(int i=0; i<t.size(); ++i) { maps[t[i]-'a']--; } for(int i=0; i<26; ++i) { if(maps[i] != 0) { return false; } } return true; } };