前言
这道leetcode编程题是道简单题,本篇文章是对哈希表unordered_map使用的一个实例,并介绍代码的思路。一、题目描述
给你一份『词汇表』(字符串数组) 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。若某个单词的字符没有和哈希表中的字符相匹配或者某个单词中的字符和哈希表中的字符匹配上了,但是哈希表中相应字符的数量已经为0,则判定没有掌握这个单词,退出当前单词字符的遍历,进入词汇表中下一个单词字符的遍历。当某个单词的最后一个字符匹配上哈希表并且其对应字符的数量大于等于0,则判定已经掌握了这个单词,将这个单词的长度和之前掌握的单词长度之和相加。
每次某个单词遍历完毕后,要恢复哈希表中字母表的字母数量。这样将词汇表中的所有单词遍历完毕后,返回掌握的单词长度之和即可。这里为了节省查找时间,所以字母表的字符数量我们选择用哈希表来存储,定义为unordered_map<string,int> model。
三、c++代码实现
话不多说,上代码:
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
int size=words.size(); //获取词汇表的单词数
unordered_map <char,int> model;
int len=0; //掌握的单词长度之和变量
for(char c:chars){
model[c]++; //依次获取字母表的字符数
}
unordered_map <char,int> temp=model;//temp才是进行匹配的实际字母表,model是模版
for(int i=0;i<size;i++){
string check;
check=words[i]; //依次获取词汇表中的单词
for(int i=0;i<check.length();i++){ //按单词顺序匹配字母表
char letter=check[i];
if(temp.find(letter)!=temp.end()&&temp[letter]>=0){//如果字符表匹配到单词表字符,字符表字母数--
temp[letter]--;
if(i==check.length()-1&&temp[letter]>=0){ //如果匹配到最后一个字符,计算长度之和
len=len+check.length();
}
}
if(temp.find(letter)==temp.end()||temp[letter]<0){ //如果字符表没匹配到单词表字符或超出可匹配字符数,跳出当前循环
break;
}
}
temp=model; //恢复字母表
}
return len;
}
};