LeetCode242. 有效的字母异位词

题目 

给定两个字符串 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

 

posted @ 2021-01-17 15:57  Uitachi  阅读(70)  评论(0编辑  收藏  举报