# 1160 Find Words That Can Be Formed by Characters

LeetCode

You are given an array of strings words and a string chars.

A string is good if it can be formed by characters from chars (each character can only be used once).

Return the sum of lengths of all good strings in words.

input: δΈ€ε­—δΈ²ι™£εˆ— words θ·ŸδΈ€ε€‹ε­—δΈ² chars
output: ε›žε‚³ words ε…¨ιƒ¨η¬¦εˆ chars ηš„ε­—δΈ²ι•·εΊ¦
Example 1:

Input: words = ["cat","bt","hat","tree"], chars = "atach"
Output: 6
Explanation: 
The strings that can be formed are "cat" and "hat" so the answer is 3 + 3 = 6.

Example 2:

Input: words = ["hello","world","leetcode"], chars = "welldonehoneyr"
Output: 10
Explanation: 
The strings that can be formed are "hello" and "world" so the answer is 5 + 5 = 10.
 

Note:

1 <= words.length <= 1000
1 <= words[i].length, chars.length <= 100
All strings contain lowercase English letters only.


/**
 * @param {string[]} words
 * @param {string} chars
 * @return {number}
 */
var countCharacters = function(words, chars) {}

ζ€ŽιΊΌθ§£

一個字串εͺθƒ½θ’«η”¨δΈ€ζ¬‘οΌŒζˆ‘ζƒ³εˆ°ζœƒε…ˆζŠŠ chars ε­˜ι€² map θ£‘οΌŒη„ΆεΎŒ words ε†εŽ»ηœ‹ζœ‰ζ²’ζœ‰η¬¦εˆ

var countCharacters = function(words, chars) {
    // 硱計 chars 字母出現欑數
    let myMap= new Map();
    for(let i = 0; i< chars.length; i++){
      if(myMap.has(chars[i])){
        myMap.set(chars[i], myMap.get(chars[i]) + 1)
      }else{
        myMap.set(chars[i], 1)
      }
    }


    // η΅±θ¨ˆζœ€εΎŒη΅ζžœζ•Έε­—
    let totalCount = 0

    // 一個一個比對
    words.map(word => {

      let allPass = true

      // 硱計 word 各個字出現數量
      let wordMap = new Map();
      for (let i = 0; i < word.length; i++) {
        if(myMap.has(word[i])){
          
          let count = !wordMap.get(word[i]) ? 1 : wordMap.get(word[i]) + 1;
          wordMap.set(word[i], count)
        }else{
          allPass = false  
          break;
        }
      }
      let lengthPass = true;
      
      // ζ―”ε°ε‡ΊηΎζ¬‘ζ•Έζœ‰ζ²’ζœ‰ε€§ζ–Ό charsοΌŒε€§ζ–Όηš„θ©±ε°±δΈιŽ
      if(allPass){
        let countLen = 0
        wordMap.forEach((value, index) => {
            countLen += value;
            if(value > myMap.get(index)){
                lengthPass = false
            }   
        })

        if( lengthPass){
            totalCount += countLen;
        }
      }
    //  
      
      
     
    })
    return totalCount;
};

console.log(countCharacters(["catc","bt","hat","tree"],'atach'))
//faster than 84.68% of JavaScript online submissions

Last updated

Was this helpful?