# 1160. Find Words That Can Be Formed by Characters ## 題目敘述 ![](https://i.imgur.com/ERPWS2b.jpg) 題目意思: chars內英文必須可以組成words裡面的單詞,不需看順序 如範例 Input: words = ["cat","bt","hat","tree"], chars = "atach" cat 有 at c hat 有 at h 所以總共有 3+3 = 6 Output: 6 ## 初步想法 ### 第一次看到 想要統計chars哪個字符有幾次,比如 a:2 t:1 c:1 h:1 words陣列中內自一個個拉出來比較,cat中 c:1 a:1 t:1 當words內字符都有被chars包含, 則該字有符合,算入字數加總 ## 解題 ### 作法1 : array間比較 ``` var countCharacters = function(words, chars) { let chars_keys = hashMap(chars) let ans = 0 for(let i in words){ let matchOrNot = 0 let word_keys = hashMap(words[i]) for(let prop in word_keys){ //word_keys prop 必須在chars_keys 且兩數相減必須大於等於0 if(chars_keys[prop] == undefined || chars_keys[prop] - word_keys[prop] < 0){ matchOrNot = 1 break } } if(matchOrNot == 0) ans += words[i].length } return ans // 將chars用 hash map 如 a:2 c:1 t:1 h:1,按照字母順序,以加速之後運行時間 function hashMap(array){ let keys ={} array = array.split('').sort().join('') for(let i in array){ if(keys[array[i]] == undefined){ keys[array[i]] = 1 } else keys[array[i]] += 1 } return keys } }; ``` ### 說明: ``` array = array.split('').sort().join('') ``` 將每一個字串預處理,如 chars = "atach" * 字符取出 chars.split('') 得到 [ 'a', 't', 'a', 'c', 'h' ] * 排序後 chars.split('').sort() 得到 [ 'a', 'a', 'c', 'h', 't' ] * 去掉'' chars.split('').sort().join('') 得到 aacht > 使用這個方式是為了之後遍歷時,可以比較快 ``` if(chars_keys[prop] == undefined || chars_keys[prop] - word_keys[prop] < 0){ matchOrNot = 1 break } ``` * chars_keys[prop] == undefined 遍歷中,prop就是迴圈中array的key,所以此為判斷chars_keys中是否具有word_key,如果沒有就直接不符合 * chars_keys[prop] - word_keys[prop] < 0 判斷chars_keys中該key數量-word_keys中該key數量是否足夠,不足直接不符合 ### 最終結果 ![](https://i.imgur.com/KdgZzAW.jpg) ###### tags: `Leetcode`