美文网首页
有效的字母异位词

有效的字母异位词

作者: 小王子特洛伊 | 来源:发表于2019-10-23 06:45 被阅读0次

    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
    示例 1:
    输入: s = "anagram", t = "nagaram"
    输出: true
    示例 2:
    输入: s = "rat", t = "car"
    输出: false
    说明:
    你可以假设字符串只包含小写字母。
    进阶:
    如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

    解法 1

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

    def is_anagram(s, t):
        if len(s) != len(t):
            return False
        return sorted(s) == sorted(t)
    

    执行用时 :76 ms
    内存消耗 :14.6 MB

    时间复杂度:长度为 n 的字符串的快排时间复杂度为 O(n log n),两个字符串比较的成本为 O(n),排序时间占主导地位,总体时间复杂度为 O(n log n)。
    空间复杂度:O(1)。

    解法 2

    如果只包含小写字母,可以利用两个长度为 26 的数组,分别存储两个字符串中每个字符出现的次数,最后判断两个数组是否相同。这里可以将 ord(item) - ord('a') 看作一个哈希函数,将小写字母的 ASCII 码映射为 0 - 25 的数字,理论上数组要比哈希表更快。

    def is_anagram(s, t):
        if len(s) != len(t):
            return False
        dic1, dic2 = [0] * 26, [0] * 26
        for item in s:
            dic1[ord(item) - ord('a')] += 1
        for item in t:
            dic2[ord(item) - ord('a')] += 1
        return dic1 == dic2
    

    执行用时 :68 ms
    内存消耗 :14.3 MB

    时间复杂度:数组的插入、修改操作都为 O(1),由于要操作 n 个字符,所以时间复杂度为 O(n)。
    空间复杂度:虽然使用了额外的空间,但数组的长度是固定的,所以空间复杂度为 O(1)。

    解法 3

    如果是 unicode 字符,也可以利用两个哈希表,分别存储两个字符串中每个字符出现的次数,最后判断两个哈希表是否相同。

    def is_anagram(s, t):
        if len(s) != len(t):
            return False
        dic1, dic2 = {}, {}
        for item in s:
            dic1[item] = dic1.get(item, 0) + 1
        for item in t:
            dic2[item] = dic2.get(item, 0) + 1
        return dic1 == dic2
    

    执行用时 :68 ms
    内存消耗 :14.2 MB

    时间复杂度:哈希表的插入、修改操作都为 O(1),由于要操作 n 个字符,所以时间复杂度为 O(n)。
    空间复杂度:虽然使用了额外的空间,但哈希表的长度是固定的,所以空间复杂度为 O(1)。

    参考

    https://leetcode-cn.com/problems/valid-anagram/

    相关文章

      网友评论

          本文标题:有效的字母异位词

          本文链接:https://www.haomeiwen.com/subject/pnhhvctx.html