【題目描述】
給你一份『詞匯表』(字符串?dāng)?shù)組) words 和一張『字母表』(字符串) chars证薇。
假如你可以用 chars 中的『字母』(字符)拼寫出 words 中的某個『單詞』(字符串),那么我們就認(rèn)為你掌握了這個單詞寇窑。
注意:每次拼寫時箩张,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刊愚、1 <= words.length <= 1000
2鸥诽、1 <= words[i].length, chars.length <= 100
3、所有字符串中都僅包含小寫英文字母
【思路】
1拳昌、字符個數(shù)比較钠龙,使用哈希表
2、words中的每個單詞和chars比較沈矿,chars包含單詞 單詞的個數(shù)記錄下來羹膳,否則下一個單詞
3谷羞、時間復(fù)雜度0(m*n) m為單詞的個數(shù) n為單詞的字符數(shù)
4、空間復(fù)雜度O(n)
Swift代碼實現(xiàn):
func countCharacters(_ words: [String], _ chars: String) -> Int {
if chars.count == 0 || words.count == 0 { return 0 }
var charsMap = [Character:Int]()
for c in chars {
var value = charsMap[c] ?? 0
value+=1
charsMap[c] = value
}
var strArr = [String]()
for str in words {
var tmp = charsMap
for (i,cc) in str.enumerated() {
var count = tmp[cc] ?? 0
if count == 0 {
break
}
count-=1
tmp[cc] = count
if i == str.count-1 {
strArr.append(str)
}
}
}
var res = 0
for s in strArr {
res+=s.count
}
return res
}