给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
hash_abc = [0] * 26
for i in range(len(magazine)):
hash_abc[ord(magazine[i]) - ord('a')] += 1
for i in range(len(ransomNote)):
if hash_abc[ord(ransomNote[i]) - ord('a')] == 0:
return False
else:
hash_abc[ord(ransomNote[i]) - ord('a')] -= 1
return True
看代码随想录文章后新增知识:
之前在使用字典的时候, 用的比较随意, 只是简单的使用dict.
然而这样在使用不存在的key的时候发生KeyError这样的一个报错, 这时候就该defaultdict登场了.
1 2 |
|
使用defaultdict任何未定义的key都会默认返回一个根据method_factory参数不同的默认值, 而相同情况下dict()会返回KeyError.
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
from collections import defaultdict
hashmap = defaultdict(int)
for x in magazine:
hashmap[x] += 1
for x in ransomNote:
value = hashmap.get(x) #读取dict中value
if value is None or value == 0:
return False
else:
hashmap[x] -= 1
return True
另外还有counter:
有了这个函数就不用手动的使用 for 循环来手动统计词频啦!
Counter() 是 collections 库中的一个函数,可以用来统计一个 python 列表、字符串、元组等可迭代对象中每个元素出现的次数,并返回一个字典。
nums = [1, 1, 1, 6, 6, 6, 7, 8]
count = Counter(nums)
for k, v in count.items():
print(k, v)
使用 Counter 统计完词频后可以使用 most_common 方法来查找出现频率最高的 k 个数字及其出现次数。
ansdict = count.most_common(2) # 返回出现次数最多的两个数及其出现的次数 如[(1, 3), (6, 3)]
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
c1 = collections.Counter(ransomNote)
c2 = collections.Counter(magazine)
x = c1 - c2
#x只保留值大于0的符号,当c1里面的符号个数小于c2时,不会被保留
#所以x只保留下了magazine不能表达的
if(len(x)==0):
return True
else:
return False