0
点赞
收藏
分享

微信扫一扫

通过Docker新建并使用MySQL数据库

妖妖妈 04-20 18:30 阅读 2

代码随想录-哈希表 | 242 有效的字母异位词

LeetCode 242-有效的字母异位词

题目链接

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

解题思路

判断

  • 暴力解法:两层for循环,同时记录字符是否重复出现,很明显时间复杂度是 O(n^2)。
  • 哈希表(数组):题目中只有小写字符,因此定义一个大小为26的数组record,记录字符串中每个字母出现的次数。
    • 先遍历字符串s,用 record 记录每个字母出现的次数。因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。遍历时,只需要将 s[i] - ‘a’ 所在的元素做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值即可。
    • 再遍历字符串t,对t中出现的字符映射哈希表索引上的数值再做-1的操作。
    • 最后,record数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false。如果record数组所有元素都为零0,说明字符串s和t是字母异位词,return true。

代码

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];

        for (int i = 0; i < s.length(); i++) {
            record[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            record[t.charAt(i) - 'a']--;
        }
        for (int count : record) {
            if (count != 0) {
                return false;
            }
        }
        return true;
    }
}

复杂度

  • 时间复杂度
    时间复杂度为O(n)
  • 空间复杂度
    ∵ 定义是的一个常量大小的辅助数组
    O(1)

难点

  • 如何记录并比较字符串中重复字符的个数:这个题目给出了一个很好的思路,用一个辅助数组去记录其中一个字符串中各个字符出现的次数,并在遍历另一个数组的时候,直接减去辅助数组中对应字符的次数,最终通过辅助数组26个索引位置的计数值判断两个字符串的重复字符的数量是否相同。

总结

学习到新知识:巧用辅助数组。复习了哈希表的思想。

举报

相关推荐

0 条评论