[力扣]1160. 拼写单词

拼写单词

Posted by JinFei on April 9, 2020

题目描述

给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。 注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。 返回词汇表 words 中你掌握的所有单词的 长度之和。

Example1:

  输入:words = ["cat","bt","hat","tree"], chars = "atach"
    输出:6
    解释: 
    可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。

Example2:

  输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
    输出:10
    解释:
    可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。

Example3:

  输入:[[0,2]]
    输出:0
    解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

提示

  • 1 <= words.length <= 1000
  • 1 <= words[i].length, chars.length <= 100
  • 所有字符串中都仅包含小写英文字母

解题思路

  • 哈希表的简单应用
  • 统计给定单词的词频
  • 然后遍历这个词典
  • 看看这个词典的字母出现次数是否大于给定单词的词频
  • 如果大于的话,证明这个词典的单词出现了给定单词的字母,我们就放弃累加这个字母的长度
class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        unordered_map<char, int> mmap;
        for(auto& i : chars){
            mmap[i]++;
        }
        int res = 0;
        for(auto& i : words){
            string str = i;
            unordered_map<char, int> t;
            for(auto& s : str){
                t[s]++;
            }
            bool isfound = true;
            for(auto& s : str){
                if(t[s] > mmap[s]){
                    isfound = false;
                    break;
                }
            }
            if(isfound){
                res += str.size();
            }
            
        }
        return res;
    }
};