题目链接
题目描述
给定两个字符串 _s_ 和 _t_ ,编写一个函数来判断 _t_ 是否是 _s_ 的字母异位词。
注意:若 _s_ 和 _t_ 中每个字符出现的次数都相同,则称 _s_ 和 _t_ 互为字母异位词。
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
示例
示例1:
输入: s = “anagram”, t = “nagaram” 输出: true
提示
1 <= s.length, t.length <= 5 * 10s和t仅包含小写字母思路
思路1:排序
将两个字符串排序,然后判断是否相等。思路2:哈希表
本题因为只涉及小写字母,因此我们可以使用数组代替哈希表。
对于unicode字符来说,我们就需要使用哈希表。
此思路有两种方案:
- 使用哈希表保存
s中出现的字符的个数,再减去t中字符出现的个数,最后检查每个字符的个数是否为0。 先判断两个字符串长度是否相等,若相等,再使用哈希表保存
s中出现的字符的个数,遍历t,将对应字符的个数减一,若个数出现负数则直接返回false。题解
思路2:哈希表
// 数组版class Solution {public:bool isAnagram(string s, string t) {int count[26]{0};for (char c : s) {count[c - 'a']++;}for (char c : t) {count[c - 'a']--;}return all_of(begin(count), end(count), [](int x) { return x == 0; });}};// 哈希表class Solution {public:bool isAnagram(string s, string t) {unordered_map<char, int> map;for (char c : s) {map[c]++;}for (char c : t) {map[c]--;}return all_of(map.begin(), map.end(), [](pair<char, int> p) { return p.second == 0; });}};
复杂度分析
思路2:哈希表
- 时间复杂度:
- 空间复杂度:
,
为字符集大小。
