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 <= words.length <= 1000
1 <= words[i].length, chars.length <= 100
- All strings contain lowercase English letters only.
Rust Solution
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);
}
Having problems with this solution? Click here to submit an issue on github.