题目描述
解法:哈希表计数
这道题很简单,有个稍微要注意的地方就是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]