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.
class Solution:
def countCharacters(self, words: List[str], chars: str) -> int:
counter = Counter(chars)
ans = 0
for word in words:
cnt = Counter(word)
if all([counter[c] >= v for c, v in cnt.items()]):
ans += len(word)
return ans
class Solution {
public int countCharacters(String[] words, String chars) {
int[] counter = count(chars);
int ans = 0;
for (String word : words) {
int[] cnt = count(word);
if (check(counter, cnt)) {
ans += word.length();
}
}
return ans;
}
private int[] count(String s) {
int[] counter = new int[26];
for (char c : s.toCharArray()) {
++counter[c - 'a'];
}
return counter;
}
private boolean check(int[] cnt1, int[] cnt2) {
for (int i = 0; i < 26; ++i) {
if (cnt1[i] < cnt2[i]) {
return false;
}
}
return true;
}
}
class Solution {
public:
int countCharacters(vector<string>& words, string chars) {
vector<int> counter = count(chars);
int ans = 0;
for (auto& word : words)
{
vector<int> cnt = count(word);
if (check(counter, cnt)) ans += word.size();
}
return ans;
}
vector<int> count(string s) {
vector<int> counter(26);
for (char c : s) ++counter[c - 'a'];
return counter;
}
bool check(vector<int>& cnt1, vector<int>& cnt2) {
for (int i = 0; i < 26; ++i)
if (cnt1[i] < cnt2[i]) return false;
return true;
}
};
func countCharacters(words []string, chars string) int {
counter := count(chars)
ans := 0
for _, word := range words {
cnt := count(word)
if check(counter, cnt) {
ans += len(word)
}
}
return ans
}
func count(s string) []int {
counter := make([]int, 26)
for _, c := range s {
counter[c-'a']++
}
return counter
}
func check(cnt1, cnt2 []int) bool {
for i := 0; i < 26; i++ {
if cnt1[i] < cnt2[i] {
return false
}
}
return true
}