五月集训——Day2:1160

这篇博客主要介绍了LeetCode第1160题——拼写单词的解题过程。作者首先阐述了题目的要求,即根据给定的字母表chars判断能否拼出词汇表words中的单词,并返回能拼出的单词长度之和。接着,提供了基础的C++代码框架,并详细解释了解题思路,包括记录字母出现次数、比较字母数量等步骤。博主提到时间复杂度为O(n^2),并分享了使用字符串处理问题的心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

***、题目链接

        Day2:Leetcod 1160. 拼写单词

一、题目

1、题目描述

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

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

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

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

        样例输入: words = ["cat","bt","hat","tree"], chars = "atach"
        样例输出: 6

2、基础框架

  • C++给出的代码框架如下:
class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {

    }
};

二、解题报告

1、思路分析

       ( 1 ) (1) (1)chars 和每个 words的每个字母出现次数记录下来;
       ( 2 ) (2) (2) 比较两个记录字母出现的字符串;
       ( 3 ) (3) (3) 如果words 中存在字母在 chars 中没有出现过,或者 words 中存在字母出现个数大于 chars 中出现的个数,则跳过该单词;反之,对其长度累加。

2、时间复杂度

       O ( n 2 ) O(n^2) O(n2) ,;

3、代码详解

class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        vector<string> iter;
        int sum = 0;
        string tempChars = "00000000000000000000000000";
        for(int i = 0; i < chars.size(); ++i){
            tempChars[chars[i] - 'a'] ++;
        }
        for(auto &word : words){
            bool isCan = true;
            string tempWord = "00000000000000000000000000";
            for(int i = 0; i < word.size(); ++i){
                tempWord[word[i] - 'a'] ++;
            }
            for(int i = 0; i < word.size(); ++i){
                if(tempChars[word[i] - 'a'] == '0' || tempWord[word[i] - 'a'] > tempChars[word[i] - 'a']){                  
                    isCan = false;
                    break;
                }         
            }
            if(isCan) sum += word.size();
        }
        return sum;
    }
};

三、写在最后

          核心思路是记录与比较,其实也可以用哈希表做,但现在是字符串专题,还是用字符串做吧,哈哈哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值