最近开始系统地刷题目了,看到比较有意思的题目就写一下心得体会吧~
这道题题目如下所示:
考虑到chars中每个字符都只能被使用一次,因此不能直接使用set来去重,而是应该考虑使用dict来给每个字符计数,然后在依次对words中的每个字符进行计数,然后再进行比较,将符合条件的字符的长度加和,得到最终结果。
使用字典的代码如下所示:
from collections import defaultdict
class Solution:
def countCharacters(self, words: List[str], chars: str) -> int:
#用字典记录words中每个字符串的每个字符的出现次数,然后和chars里面的进行比较
check_dict = defaultdict(int)
result = 0
for i in chars:
check_dict[i] += 1
for i in range(len(words)):
mid = defaultdict(int)
for j in words[i]:
mid[j] += 1
count = 0
for k in mid.keys():
if check_dict[k] < mid[k]:
count += 1
if count == 0:
result += len(words[i])
return result
但是这种方法的速度并不是很好,有点违背了我对哈希表速度超快的印象。
我想了一下,可能是创建哈希表的过程会比较耗时。虽然哈希表查询的效率很高,但在这种数据量不大的情况下,如果对所有字符串都生成一次哈希表的话,可能效率就下来了。因此我就想试试直接用count来算一次。
class Solution:
def countCharacters(self, words: List[str], chars: str) -> int:
#这个直接用count计数然后再进行比较
result = 0
for i in words:
signal = 0
for j in i:
if i.count(j) > chars.count(j):
signal = 1
break
if signal == 0:
result += len(i)
return result
这种方法的效率明显高于用字典的方法,感觉哈希表速度慢的原因应该是和我想的差不多。
写完后按照惯例看一下大神们是怎么写的。果不其然有新发现:
①在不调用defaultdict的情况下,可以直接用dict.get来对不存在的key设置默认值;
②在collections库中,还可以调用counter函数,可以直接对字符串中的字符进行计数得到一个字典
只能说学海无涯,多看看总会有新发现😀
写完这题之后感觉,好的方法往往不会比合适的方法更快,甚至可能会更慢。如果大佬们觉得字典方法速度更慢有别的原因,也欢迎指出~