<p>You are given an array of strings <code>words</code> and a string <code>chars</code>.</p>

<p>A string is <strong>good</strong> if it can be formed by characters from <code>chars</code> (each character can only be used once).</p>

<p>Return <em>the sum of lengths of all good strings in words</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> words = [&quot;cat&quot;,&quot;bt&quot;,&quot;hat&quot;,&quot;tree&quot;], chars = &quot;atach&quot;
<strong>Output:</strong> 6
<strong>Explanation:</strong> The strings that can be formed are &quot;cat&quot; and &quot;hat&quot; so the answer is 3 + 3 = 6.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> words = [&quot;hello&quot;,&quot;world&quot;,&quot;leetcode&quot;], chars = &quot;welldonehoneyr&quot;
<strong>Output:</strong> 10
<strong>Explanation:</strong> The strings that can be formed are &quot;hello&quot; and &quot;world&quot; so the answer is 5 + 5 = 10.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= words.length &lt;= 1000</code></li>
	<li><code>1 &lt;= words[i].length, chars.length &lt;= 100</code></li>
	<li><code>words[i]</code> and <code>chars</code> consist of lowercase English letters.</li>
</ul>

class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        std::unordered_map<char, std::size_t> char_map;
        for (const auto c: chars){
            if (char_map.find(c) == char_map.end()){
                char_map[c] = 1U;
            }
            else{
                ++char_map[c];
            }
        }
        std::size_t total_len{0U};
        for (const auto word : words){
            if (word.size() > chars.size()){
                continue;
            }
            bool is_valid{true};
            auto temp_map{char_map};
            for (const auto c : word){
                if (temp_map.find(c) == temp_map.end()){
                    is_valid = false;
                    break;
                }
                else{
                    --temp_map[c];
                    if (temp_map[c] == 0U){
                        temp_map.erase(c);
                    }
                }
            }
            if (is_valid){
                total_len += word.size();
            }
        }
        return total_len;
    }
};
42844