拼写单词(题目出自leetcode)

230 阅读1分钟

题目描述:

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

回答:

/**
 * @param {string[]} words
 * @param {string} chars
 * @return {number}
 * 思路:
 * 遍历words,把words的item转换成数组(child),遍历过程中把chars也转换成数组(charArr),
 * 判断child的子元素是否全部都在charArr,如果是证明符合
 */
var countCharacters = function(words, chars) {
    let sum = 0;  // 记录长度之和
    words.forEach(item => {
        // 把chars换成数组(charArr)
        let charArr = chars.split('')
        // 遍历 words的child
        if(item.split('').every(char => {
            // 判断child的子元素是否在charArr中
            let idx = charArr.indexOf(char);
            if ( ~idx ) {  // 取反 -1~ = 0; 其他~value != 0 
               // 因为每个字母只能用一遍,所以当存在的时候charArr需要把此字母删除,已保证用一遍
               charArr.splice(idx, 1);
               return true;
            } else {
                return false;
            }
        })) {
           // 把符合规则的单词的长度相加
           sum = sum + item.length
        }
    })
    return sum;
};