题目描述
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。 注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。 返回词汇表 words 中你掌握的所有单词的 长度之和。
Example1:
输入:words = ["cat","bt","hat","tree"], chars = "atach" 输出:6 解释: 可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。
Example2:
输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr" 输出:10 解释: 可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。
Example3:
输入:[[0,2]] 输出:0 解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
提示
- 1 <= words.length <= 1000
- 1 <= words[i].length, chars.length <= 100
- 所有字符串中都仅包含小写英文字母
解题思路
- 哈希表的简单应用
- 统计给定单词的词频
- 然后遍历这个词典
- 看看这个词典的字母出现次数是否大于给定单词的词频
- 如果大于的话,证明这个词典的单词出现了给定单词的字母,我们就放弃累加这个字母的长度
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
unordered_map<char, int> mmap;
for(auto& i : chars){
mmap[i]++;
}
int res = 0;
for(auto& i : words){
string str = i;
unordered_map<char, int> t;
for(auto& s : str){
t[s]++;
}
bool isfound = true;
for(auto& s : str){
if(t[s] > mmap[s]){
isfound = false;
break;
}
}
if(isfound){
res += str.size();
}
}
return res;
}
};