1. 题目来源
链接:有效的字母异位词
来源:LeetCode
2. 题目说明
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
说明:
- 你可以假设字符串只包含小写字母。
进阶:
- 如果输入字符串包含
unicode
字符怎么办?你能否调整你的解法来应对这种情况?
示例1:
输入: [1,3,5]
输出: 1
示例2:
输入: [2,2,2,0,1]
输出: 0
3. 题目解析
方法一:sort()函数
写这道题就是为了用下 sort()
函数,它当然是可以给字符串进行排序的,确实挺好用的在这。
参见代码如下:
// 执行用时 :32 ms, 在所有 C++ 提交中击败了27.41%的用户
// 内存消耗 :9.5 MB, 在所有 C++ 提交中击败了30.34%的用户
class Solution {
public:
bool isAnagram(string s, string t) {
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
};
方法二:哈希映射
核心点就在于使用哈希表映射,还是用一个数组来代替哈希表,然后把 s
中所有的字符出现个数统计起来,存入一个大小为 256 的数组中,此题好像 26 大小的即可,因为题目中限定了输入字符串为小写字母组成。然后我们再来统计 t
字符串,如果发现不匹配则返回 false
。
参见代码如下:
// 执行用时 :12 ms, 在所有 C++ 提交中击败了17.42%的用户
// 内存消耗 :14.7 MB, 在所有 C++ 提交中击败了5.15%的用户
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> v1(256, 0), v2(256, 0);
for (auto e : s) ++v1[e];
for (auto e : s) ++v2[e];
for (int i = 0; i < v1.size(); ++i)
if (v1[i] != v2[i]) return false;
return true;
}
};