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

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. `1 <= words.length <= 1000`
2. `1 <= words[i].length, chars.length <= 100`
3. All strings contain lowercase English letters only.

1160. Find Words That Can Be Formed by Characters
``````struct Solution;

use std::collections::HashMap;

impl Solution {
fn str_2_hs(s: &str) -> HashMap<char, i32> {
let mut hs: HashMap<char, i32> = HashMap::new();
for c in s.chars() {
*hs.entry(c).or_default() += 1;
}
hs
}

fn count_characters(words: Vec<String>, chars: String) -> i32 {
let chars = Self::str_2_hs(&chars);
let mut sum = 0;
for w in words {
let mut chars = chars.clone();
let mut valid = true;
for c in w.chars() {
let count = chars.entry(c).or_default();
*count -= 1;
if *count < 0 {
valid = false;
break;
}
}
if valid {
sum += w.len();
}
}
sum as i32
}
}

#[test]
fn test() {
let words = vec_string!["cat", "bt", "hat", "tree"];
let chars = "atach".to_string();
assert_eq!(Solution::count_characters(words, chars), 6);
let words = vec_string!["hello", "world", "leetcode"];
let chars = "welldonehoneyr".to_string();
assert_eq!(Solution::count_characters(words, chars), 10);
}
``````