题目描述:
给你一份『词汇表』(字符串数组)
words
和一张『字母表』(字符串)chars
。
假如你可以用chars
中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写时,chars
中的每个字母都只能用一次。
返回词汇表words
中你掌握的所有单词的 长度之和。
示例 1:
输入:words = ["cat","bt","hat","tree"], chars = "atach"strong text
输出: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
中出现的次数; -
对于
words
中每一个字符串,判断其字母出现次数,分如下两种情况:- 如果大于哈希表中的次数,则表示字典中已经没有可用字符,此时应跳出循环;
- 否则表示字典中尚存在可用字符,继续执行,如果整个字符串遍历完成,则将字符长度累计到ans中;
-
循环结束后返回ans,即可通过;
具体代码如下 :
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
unordered_map<char,int> hash,temp;int N;int ok;int ans = 0;
for(char c:chars)hash[c]++;
for(string str:words){
temp = hash;
ok = 1;
for(char c : str){
temp[c]--;
if(temp[c] < 0){
ok = 0;break;
}
}
if(ok)ans += str.size();
}
return ans;
}
};