题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
代码
法一、排序后判断是否相等,因为题目中说了字符串都为26个小写字母。
t 是 s 的异位词等价于两个字符串排序后相等。以后要学会这个技巧
1 class Solution { 2 public: 3 bool isAnagram(string s, string t) { 4 if(s.length()!=t.length()) return false; 5 sort(s.begin(),s.end()); 6 sort(t.begin(),t.end()); 7 return s == t; 8 } 9 };
法二、哈希表。数组就是一个简单的哈希表
1 class Solution { 2 public: 3 bool isAnagram(string s, string t) { 4 if(s.length()!=t.length()) return false; 5 int ans[26]; 6 for(int i = 0;i < 26;i++) ans[i] = 0; 7 for(int i = 0;i < s.length();i++) ans[s[i] - 'a']++; 8 for(int i = 0;i < t.length();i++) ans[t[i] - 'a']--; 9 10 for(int i = 0;i < 26;i++){ 11 if(ans[i] != 0) return false; 12 } 13 return true; 14 } 15 };
这里因为为26个小写字母,所以开的数组大小为26,用该数组记录每个字母
的次数。这里使用数组作为哈希表是因为都是小写字母,哈希值不会太大。
这里要学会技巧如何将一个字母映射到数组7-8行,s[i] - 'a' ,这样索引0代表
字母a。
这样时间复杂度为O(n),空间复杂度为O(1),数组空间大小固定。
总结
如果哈希值太大,并且值的个数比较少,而且跨度比较大,那么使用数组就不太
合适,因为数组会带来巨大的空间浪费。此时可以考虑采用set