题目
给你一份『词汇表』(字符串数组) 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。
思路
- 使用哈希表记录chars出现的字母以及出现次数,然后对words里面的单词逐个进行比对。如果某个word的单词都在chars里,则掌握,如果某个word需要的字符不在或者不够,则没掌握。
代码
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
if ( words.empty() || chars.empty() )
return 0;
// vector<int> hash( 128, 0 );
// vector<int> copyHash( 128, 0 );
int res = 0;
int hash[128] = { 0 };
int copyHash[128] = { 0 };
for ( auto& c : chars )
hash[c] += 1;
for ( auto& word : words ) {
int cnt = 0;
memcpy( copyHash, hash, sizeof(copyHash) );
// copyHash = hash;
for ( auto& c : word ) {
if ( copyHash[c] == 0 )
break;
--copyHash[c];
++cnt;
}
if ( cnt == word.size() )
res += word.size();
}
return res;
}
};