题目链接

题目描述

给定两个字符串 _s__t_ ,编写一个函数来判断 _t_ 是否是 _s_ 的字母异位词。
注意:_s__t_ 中每个字符出现的次数都相同,则称 _s__t_ 互为字母异位词。
进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

示例

示例1:

输入: s = “anagram”, t = “nagaram” 输出: true

提示

  • 1 <= s.length, t.length <= 5 * 10
  • st 仅包含小写字母

    思路

    思路1:排序

    将两个字符串排序,然后判断是否相等。

    思路2:哈希表

    本题因为只涉及小写字母,因此我们可以使用数组代替哈希表。
    对于unicode字符来说,我们就需要使用哈希表。
    此思路有两种方案:
  1. 使用哈希表保存 s 中出现的字符的个数,再减去 t 中字符出现的个数,最后检查每个字符的个数是否为 0
  2. 先判断两个字符串长度是否相等,若相等,再使用哈希表保存 s 中出现的字符的个数,遍历 t ,将对应字符的个数减一,若个数出现负数则直接返回 false

    题解

    思路2:哈希表

    1. // 数组版
    2. class Solution {
    3. public:
    4. bool isAnagram(string s, string t) {
    5. int count[26]{0};
    6. for (char c : s) {
    7. count[c - 'a']++;
    8. }
    9. for (char c : t) {
    10. count[c - 'a']--;
    11. }
    12. return all_of(begin(count), end(count), [](int x) { return x == 0; });
    13. }
    14. };
    15. // 哈希表
    16. class Solution {
    17. public:
    18. bool isAnagram(string s, string t) {
    19. unordered_map<char, int> map;
    20. for (char c : s) {
    21. map[c]++;
    22. }
    23. for (char c : t) {
    24. map[c]--;
    25. }
    26. return all_of(map.begin(), map.end(), [](pair<char, int> p) { return p.second == 0; });
    27. }
    28. };

    复杂度分析

    思路2:哈希表

  • 时间复杂度:0242-有效的字母异位词 - 图1
  • 空间复杂度:0242-有效的字母异位词 - 图20242-有效的字母异位词 - 图3 为字符集大小。