拼写单词

题目:
给你一份『词汇表』(字符串数组) 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);
}

加油哦!🍭。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值