Problem statement
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.
Solution one: hash table/array(AC)
General idea:
- if the size of two strings is not equal, return false;
- Enumerate each element of two strings, put each element into hash table/array.
- compare the hash table/array
Time complexity is O(n), space complexity is O(n)
hash table version
class Solution { public: bool isAnagram(string s, string t) { if(s.size() != t.size()){ return false; } unordered_map<char, int> dict; for(string::size_type ix = 0; ix < s.size(); ix++){ dict[s[ix]]++; } for(string::size_type ix = 0; ix < t.size(); ix++){ if(dict.find(t[ix]) != dict.end()){ dict[t[ix]]--; if(dict[t[ix]] == 0){ dict.erase(t[ix]); } } } return dict.empty(); } };
array version
class Solution { public: bool isAnagram(string s, string t) { if(s.size() != t.size()){ return false; } int size = s.size(); vector<int> sv(26, 0), tv(26, 0); for(int i = 0; i < size; i++){ sv[s[i] - 'a']++; tv[t[i] - 'a']++; } return sv == tv; } };
Solution two: sort and compare
- Sort two strings
- compare whether they are equal
Time complexity is O(nlgn), space complexity is O(1)
class Solution { public: bool isAnagram(string s, string t) { sort(s.begin(), s.end()); sort(t.begin(), t.end()); return s == t; } };