拼写单词

144 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。