leetcode 1160. 拼写单词 python (for else用法,Counter用法)

leetcode 1160. 拼写单词

题目描述

在这里插入图片描述

解法:哈希表计数

这道题很简单,有个稍微要注意的地方就是chars中的每个字母都只能用一次。思路:统计chars字符串中,各个字母的个数。再循环words,统计每个单词中各个字母出现的个数,查询每个出现字母的个数是否大于chars中的个数,如果大于就是错误,如果小于或等于,就是正确。

思路就是这样,主要是leetcode官方给出的答案很精简,用到了一些小技巧,值得学习借鉴(官方baba牛逼)。

我的代码:(别笑,我就是颗小白菜)

class Solution:
    def countCharacters(self, words: List[str], chars: str) -> int:
        if not words or not chars:
            return 0
        res = 0
        d = {}
        for i in chars:
            if i not in d.keys():
                d[i] = 1
            else:
                d[i] += 1
        for i in words:
            w = {}
            for j in i:
                if j not in w.keys():
                    w[j] = 1
                else:
                    w[j] += 1
            count = 0
            for k,v in w.items():
                if k not in d.keys() or v > d[k]:
                    count = 0
                    break
                else:
                    count += v
            res += count
        return res

看看官方代码:

class Solution:
    def countCharacters(self, words: List[str], chars: str) -> int:
        chars_cnt = collections.Counter(chars)
        ans = 0
        for word in words:
            word_cnt = collections.Counter(word)
            for c in word_cnt:
                if chars_cnt[c] < word_cnt[c]:
                    break
            else:
                ans += len(word)
        return ans

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/solution/pin-xie-dan-ci-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

(1)使用了Counter,它可以直接帮你统计每一个单词出现的次数,并且生成一个字典,完美取代了我那部分繁琐的代码。
(2)这个 for … else…的用法 ,绝了,和评论区的人一样,都是第一次见。
评论里 @gelthin 写得很好,可以直接作为笔记参考:

不过我看 《流畅的 python》 上面说不推荐这样写,这样写容易混乱。 python for 循环有一个大问题就是我们无法通过判断循环变量 i 来判断是否提前终止了,例如:

for i in range(10): 
    if i==9: 
        break   
和
for i in range(10): 
    pass

最终变量 i 的值都会停在 9, 而不是第一个为 9, 第二个为 10. 需要额外引进一个 flag 变量来辅助判断。 例如:

flag = True
for i in range(10): 
    if i==9: 
        flag=False 
        break

然后判断 flag 是否为 False 来判断是否提前终止。

python 一定程度上为了弥补这一问题, 引入了 for … else 结构。 这个 for … else… 中的 else 表示若循环有效结束,而不是提前终止,就执行 else 后面的语句,若提前终止,就不执行。这个 ‘else’ 和 if…else 中的else 语义不一样。或许用 then 更合适,但 python 之父不愿意再新定义一个关键字 then,就复用了这个 else

另外,这里 for 语句中的变量 i 非常特殊,例如下面的语句

for i in range(5): 
    i += 1 
    print(i) # 输出 [1,2,3,4,5]
发布了28 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xxx_gt/article/details/104916126