题目来源 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
- 所有字符串中都仅包含小写英文字母
解题思路1
- 哈希表
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
map<char, int> alphabet;
for(auto ch : chars) ++alphabet[ch];
int masterWordsLen = 0;
for(auto str : words){
bool contained = true;
map<char, int> t_alphabet;
for(auto ch : str) ++t_alphabet[ch];
for(auto ch : str){
if(alphabet[ch] < t_alphabet[ch]){
contained = false;
break;
}
}
if(contained){
masterWordsLen += str.length();
cout << "-----" << str << endl << endl;
}
}
return masterWordsLen;
}
};
解题思路2
- 直接使用字符数组,利用特殊对应关系
完整代码
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
int alphabet[26] = {0};
for(auto ch: chars){
++alphabet[ch-'a'];
}
int masterWordsLen = 0;
for(auto word : words){
std::ios::sync_with_stdio(false); //借鉴大神的写法,查了一下可以关闭流缓存,可以提高速度
int wordAlphabet[26] = {0};
bool contained = true;
for(auto ch : word){
++wordAlphabet[ch-'a'];
}
for(int i = 0; i < 26; ++i){
if(wordAlphabet[i] > alphabet[i]){
contained = false;
break;
}
}
if(contained)
masterWordsLen += word.length();
}
return masterWordsLen;
}
};
执行结果
题目来源 Leetcode,感谢🙇,如果内容对你有帮助,欢迎点赞 👍