题目描述
给你一份『词汇表』(字符串数组) words
和一张『字母表』(字符串) chars
。
假如你可以用 chars
中的『字母』(字符)拼写出 words
中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写时,chars
中的每个字母都只能用一次。
返回词汇表 words
中你掌握的所有单词的 长度之和。
示例
示例 1:
输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释:
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。
示例2:
输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
输出:10
解释:
可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。
解答方法
方法一:哈希表计数
思路
显然,对于一个单词 word
,只要其中的每个字母的数量都不大于 chars
中对应的字母的数量,那么就可以用 chars
中的字母拼写出 word
。
所以我们只需要用一个哈希表存储 chars
中每个字母的数量,再用一个哈希表存储 word
中每个字母的数量,最后将这两个哈希表的键值对逐一进行比较即可。
代码
class Solution:
def countCharacters(self, words: List[str], chars: str) -> int:
chars_cnt = collections.Counter(chars)
res = 0
for word in words:
word_cnt = collections.Counter(word)
flag = True
for ch in word_cnt:
if word_cnt[ch] > chars_cnt[ch]:
flag = False
break
if flag:
res += len(word)
return res
时间复杂度
O(n),其中 n 为所有字符串的长度和。我们需要遍历每个字符串,包括 chars
以及数组 words
中的每个单词。
空间复杂度
O(S),其中 S 为字符集大小,在本题中 S的值为 26(所有字符串仅包含小写字母)。程序运行过程中,最多同时存在两个哈希表,使用的空间均不超过字符集大小 S,因此空间复杂度为 O(S)。
网友评论