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
.
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.
Companies:
Amazon
Related Topics:
Array, Hash Table
// OJ: https://leetcode.com/problems/find-words-that-can-be-formed-by-characters/
// Author: github.com/lzl124631x
// Time: O(N) where N is the length of all the contents in `words` and `chars`
// Space: O(1)
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
int cnt[26] = {0}, ans = 0;
for (char c : chars) cnt[c - 'a']++;
for (auto w : words) {
int c[26] = {0};
bool good = true;
for (char ch : w) {
if (++c[ch - 'a'] <= cnt[ch - 'a']) continue;
good = false;
break;
}
if (good) ans += w.size();
}
return ans;
}
};