开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一份『词汇表』(字符串数组) 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。
提示:
1 <= words.length <= 1000
1 <= words[i].length, chars.length <= 100
所有字符串中都仅包含小写英文字母
二、思路分析
首先需要看明白题意,题目要求的是每个单词可以用chars中的字母拼出来,且chars中的每个单词只能使用一次。所以明显需要统计字母出现的次数。
那word中每个单词所包含的字母所出现的频率同样需要统计,在遍历每一个字母的时候,查看它所出现的次数是否小于等于chars中该字母所出现的频率,这就是解题的关键。
三、AC代码
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
int len=0;
unordered_multiset<char>vec;
unordered_multiset<char>x;
for(auto c:chars){
vec.insert(c);
}
for(auto c:words){
int j=0;
x.clear();
for(int i=0;i<c.size();i++){
x.insert(c[i]);
}
for(int i=0;i<c.size();i++){
if(x.count(c[i])<=vec.count(c[i])){
j++;
}
}
if(j==c.size()){
len+=j;
}
}
return len;
}
};
提交排名
四、总结
还是需要多做题,这样才能熟能生巧。