题目:
给你一份『词汇表』(字符串数组) 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。
思想: 用数组a[26]的下标对应字母的ASCII码值(统一减‘a’则a就会在0号下标存储),数组中存放出现次数,把词汇表和字母表中的次数进行比较即可。
- 分别把词汇表和字母表中的字母出现次数存储到数组中。词汇表一个数组,字母表中的每个单词都需要一个数组,所以需要词汇表的数组循环和字母表的每个字母数组进行比较。
- 若字母表中的出现次数大于词汇表的表示可以学习,则count++。
- 不大于每次把count重新置为0,fin表示最后的字母个数。
- 需要注意的是字母和词汇表进行比较时,词汇表的字母每次只能用一次,但不同字母之间可以多次,如: word[“hello”,“wl”] chars[ellhow] 最后的长度为7,可以看到总共需要3个l,但是字母表只有2个,原因是:字母表是大家共用的,不会因为hello用了2个ll,wl就没有l了,但如果是wlll那么就不行,因为字母表没有3个让你用,所以每次字母表和字母比较后不用变。
举例如下:
根据思路,写出代码。
代码:
int countCharacters(vector<string>& words, string chars)
{
int c[26]={0};
int count=0;
int fin=0;
for(int i=0;i<chars.size();i++)
{
c[chars[i]-'a']+=1;//字母表字母出现次数存储。-a才可以从下标0开始存储
}
for(string s:words)//循环和词汇表的单词进行比较
{
int temp[26]={0};
for(int i=0;i<s.length();i++)//循环判断是否可以表示字母中的每一个字符
{
temp[s[i]-'a']+=1;
if(c[s[i]-'a']>=temp[s[i]-'a'])//大于表示可以表示
{
count++;
}
else
{
count=0;
break;
}
}
fin+=count;//最后结果
count=0;
}
return fin;
}
int main()
{
vector<string>words;
string chars="atach";
words.push_back("cat");
words.push_back("hat");
words.push_back("tree");
cout<<countCharacters(words,chars);
}
加油哦!🍭。