来自北大算法课的Leetcode题解:242. 有效的字母异位词

本题代码https://github.com/doubleZ0108/Leetcode/blob/master/242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.py

  • 解法1: 双重for循环判断,要加标志位防止重复字符

  • 解法2(T22% S5%): 字符串排序之后比较

    • 字符串要转列表才能排序,这里可能比较耗资源,但转为列表之后不用再转回字符串,可以直接开始比较
    # 字符串排序再转回字符串
    s = ''.join(sorted(list(s)))
    
  • 解法3: 构建字典,字符作为key,有某个字符就++,最后一次循环来判断

    • 改进(T90% S100%):只用一个字典,看第一个字符串时+,看第二个字符串时-,最后看字典里是不是全零

无论对于哪种方法,都可能存在鸡尾酒排序类似的问题,可能前面都一样,只有最后一位不一样,当然也可能中间某个位置不一样
一个解决方法是 产生一个随机置换来做最后的比较;或者一上来就对两个字符串进行一个打乱
概率可以很好的解决这个问题

class Solution(object):
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        if len(s) != len(t):
            return False

        D = {}
        for l in s:
            if l in D:
                D[l] += 1
            else:
                D[l] = 1
        for l in t:
            if l in D:
                D[l] -= 1
            else:
                return False
        for k, v in D.items():
            if v > 0:
                return False
        return True


    def otherSolution(self, s, t):
        # 解法2
        if len(s) != len(t):
            return False

        # s = ''.join(sorted(list(s)))
        for l_s, l_t in zip(sorted(list(s)), sorted(list(t))):
            if l_s != l_t:
                return False

        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值