数据结构学习计划_入门_第六天_字符串

387. 字符串中的第一个唯一字符

https://leetcode.cn/problems/first-unique-character-in-a-string/
队列 哈希表 字符串 计数

方法一:哈希表

class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 哈希表
        # counter统计每个字符出现的次数
        counter = {}
        for le in s:
            if le in counter:
                counter[le] += 1
            else:
                counter[le] = 1
        for idx, ch in enumerate(s):
            if counter[ch] == 1:
                return idx
        return -1

方法二:哈希表优化

方法三:队列


383.赎金信

https://leetcode.cn/problems/ransom-note/
哈希表 字符串 计数

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。

我的思路:用一个哈希表counter记录ransomNote中的字符和字符个数,遍历magazine中的元素,如果元素在counter中,则counter中该字符的个数减1。如果counter中各字符的个数等于0或者小于0,说明 ransomNote 能由 magazine 里面的字符构成,否则不能。

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        counter = {}
        for le in ransomNote:
            if le in counter:
                counter[le] += 1
            else:
                counter[le] = 1
        for ch in magazine:
            if ch in counter:
                counter[ch] -= 1
        for c in counter:
            if counter[c] > 0:
                return False
        return True

官方解法一:

只需要满足字符串 magazine 中的每个英文字母 (’a’-’z’) 的统计次数都大于等于 ransomNote 中相同字母的统计次数即可。

官方代码:

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        if len(ransomNote) > len(magazine):
            return False
        return not collections.Counter(ransomNote) - collections.Counter(magazine)

和我的理解其实是一致的。


242. 有效的字母异位词

https://leetcode.cn/problems/valid-anagram/
哈希表 字符串 排序
我的思路:首先,如果这两个字符串长度不相等,一定不是有效的字母异位词。如果长度相等,则判断字符元素出现的次数是否相等。

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t): return False
        
        counter = {}
        for le in s:
            if le in counter:
                counter[le] += 1
            else:
                counter[le] = 1
        for ch in t:
            if ch in counter:
                counter[ch] -= 1

        for c in counter:
            if counter[c] != 0:
                return False
        return True

另一种写法,更好理解

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        record = [0] * 26
        if len(s) != len(t):
            return False
        for i in range(len(s)):
            record[ord(s[i]) - ord('a')] += 1
            record[ord(t[i]) - ord('a')] -= 1
        print(record)
        for j in range(26):
            if record[j] != 0:
                return False
                break
        return True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Pythonistas29xs

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

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

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

打赏作者

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

抵扣说明:

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

余额充值