持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 -> 拼写单词
题目描述
给你一份『词汇表』(字符串数组) 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、统计给出字符串个字符出现次数
我们可以使用一个map来统计每个字符出现的次数(这里使用数组来保存效率会更快,但我选择偷懒了)。
const getNums = (word) => {
const obj = {};
for(const i of word){
obj[i] = (obj[i] || 0) + 1;
}
return obj;
};
const wordCount = getNums(chars);
- 2、遍历比较数组元素
- (1)统计每个元素的字符出现次数
我们需要统计数组里的每个字符串元素的字符出现次数,前面我们封装了一个统计字符数的方法,这里可以直接调用。
for(const word of words){
const obj = getNums(word);
…………
}
- (2)比较当前元素与给出的字符串各字符数
对比两个字符串的字符统计数量,我们便可以知道能不能使用chars来组成当前元素,可以的话则将结果加上当前元素的长度。
for(const word of words){
const obj = getNums(word);
let flag = true;
for(let k in obj){
if(obj[k] > (wordCount[k] || 0)){
flag = false;
break;
}
}
if(flag) res += word.length;
}
完整AC代码如下:
AC代码
/**
* @param {string[]} words
* @param {string} chars
* @return {number}
*/
var countCharacters = function(words, chars) {
let res = 0;
const getNums = (word) => {
const obj = {};
for(const i of word){
obj[i] = (obj[i] || 0) + 1;
}
return obj;
};
const wordCount = getNums(chars);
for(const word of words){
const obj = getNums(word);
let flag = true;
for(let k in obj){
if(obj[k] > (wordCount[k] || 0)){
flag = false;
break;
}
}
if(flag) res += word.length;
}
return res;
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。