【每日一题】Leetcode - 1160. Find Words That Can Be Formed by Characters(拼写单词)

题目来源 Leetcode,感谢🙇‍,如果内容对你有帮助,欢迎点赞 👍


题目描述

  • 给你一份『词汇表』(字符串数组) 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
  • 所有字符串中都仅包含小写英文字母

解题思路1

  • 哈希表
class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        map<char, int> alphabet;
        for(auto ch : chars) ++alphabet[ch];

        int masterWordsLen = 0;

        for(auto str : words){
            bool contained = true;
            map<char, int> t_alphabet;
                
            for(auto ch : str) ++t_alphabet[ch];

            for(auto ch : str){
                if(alphabet[ch] < t_alphabet[ch]){
                    contained = false;
                    break;
                }
            }
            if(contained){
                masterWordsLen += str.length();
                cout << "-----" << str << endl << endl;
            }
        }
        return masterWordsLen;
    }
};

解题思路2

  • 直接使用字符数组,利用特殊对应关系

完整代码

class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        int alphabet[26] = {0};
        for(auto ch: chars){
            ++alphabet[ch-'a'];
        }
        
        int masterWordsLen = 0;
        for(auto word : words){
            std::ios::sync_with_stdio(false); //借鉴大神的写法,查了一下可以关闭流缓存,可以提高速度
            int wordAlphabet[26] = {0};
            bool contained = true;
            for(auto ch : word){
                ++wordAlphabet[ch-'a']; 
            }
            
            for(int i = 0; i < 26; ++i){
                if(wordAlphabet[i] > alphabet[i]){
                    contained = false;
                    break;
                }
            }

            if(contained)
                masterWordsLen += word.length();
        }

        return masterWordsLen;
    }
};


执行结果
在这里插入图片描述


题目来源 Leetcode,感谢🙇‍,如果内容对你有帮助,欢迎点赞 👍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值