# # 1160 Find Words That Can Be Formed by Characters

[LeetCode](https://leetcode.com/problems/find-words-that-can-be-formed-by-characters/)

```
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
```
