刷题总结:有效的字母异位词、赎金信——使用python

KW47/20:学习了哈希表的知识,一共练习2个题目,现在总结如下。

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

  1. 思路:首先得知道什么是字母异位词,即两个字符串长度一样,各个字母的个数一样,只是顺序不同。
    (1)第一个想法是使用字典,遍历字符串s,键是字母,值是字母出现的次数。然后遍历另一个字符串t,减去字典中对应字母出现的次数,如果次数小于0,说明t包含一个不在s中的字母。代码如下
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        d = {}
        # 首先判断两个字符串长度是否相等,不等的话,返回False
        if len(s) != len(t):  
            return False
        # 遍历字符串s,在字典中记录每个字母出现的次数    
        for c in s:
            if c not in d:
                d[c] = 1
            else:
                d[c] += 1
        # 遍历字符串t,如果有字母不在字典中,返回False。
        # 或者字母在字典中,则该字母出现的次数减1。
        # 如果有字母出现的次数<0,说明这个字母不在字符串s中。
        for c in t:
            if c not in d:
                return False
            else:
                d[c] -= 1
                if d[c] < 0:
                    return False
        return True

第二题:赎金信,给定两个字符串ransom和magazine,第一个字符串的所有字母必须由第二个字符串中的字母构成,并且第二个字符串中的字母在第一个字符串中只能使用一次。

  1. 思路:
    (1)第一个想法是使用字典,遍历magazine字符串,键是字母,值是字母出现的次数。然后遍历ransom字符串,减去字典中对应字母出现的次数,如果次数小于0,说明ransom包含一个使用了多次的字母。代码如下
class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        d = {}
        # 首先判断ransomNote长度是否>magazine,大于的话,返回False
        if len(ransomNote) > len(magazine):
            return False
        # 遍历magazine字符串,结果存到字典
        for c in magazine:
            if c not in d:
                d[c] = 1
            else:
                d[c] += 1
        # 遍历ransomNote字符串,看是否都在字典中,不在的话,返回False
        # 在字典的话,该字母出现的次数减1,
        # 如果有字母出现的次数<0,说明ransomNote包含一个使用多次的字母
        for c in ransomNote:
            if c not in d:
                return False
            else:
                d[c] -= 1
                if d[c] < 0:
                    return False
        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值