LeetCode 1160.拼写单词(c++)

104 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

1160.拼写单词

给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。

假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。

注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。

返回词汇表 words 中你掌握的所有单词的 长度之和。

示例 1:

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

示例 2:

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

提示:

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

二、思路分析

首先需要看明白题意,题目要求的是每个单词可以用chars中的字母拼出来,且chars中的每个单词只能使用一次。所以明显需要统计字母出现的次数。

那word中每个单词所包含的字母所出现的频率同样需要统计,在遍历每一个字母的时候,查看它所出现的次数是否小于等于chars中该字母所出现的频率,这就是解题的关键。

三、AC代码

class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        int len=0;
        unordered_multiset<char>vec;
        unordered_multiset<char>x;
        for(auto c:chars){
            vec.insert(c);
        }
        for(auto c:words){
            int j=0;
            x.clear();
            for(int i=0;i<c.size();i++){
                x.insert(c[i]);
            }
            for(int i=0;i<c.size();i++){
                if(x.count(c[i])<=vec.count(c[i])){
                    j++;
                }
            }
            if(j==c.size()){
                len+=j;
            }
        }
        return len;
    }
};

提交排名

image.png

四、总结

还是需要多做题,这样才能熟能生巧。