• 拼写单词[哈希表]----leetcode周赛150_1001


    题目描述:

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

    示例 1:

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

    示例 2:

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

    提示

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

    思路:

    • chars以键值对方式存入哈希表,键为字母,值为字母在chars中出现的次数;

    • 对于words中每一个字符串,判断其字母出现次数,分如下两种情况:

      1. 如果大于哈希表中的次数,则表示字典中已经没有可用字符,此时应跳出循环;
      2. 否则表示字典中尚存在可用字符,继续执行,如果整个字符串遍历完成,则将字符长度累计到ans中;
    • 循环结束后返回ans,即可通过;

    具体代码如下 :

    class Solution {
    public:
        int countCharacters(vector<string>& words, string chars) {
            unordered_map<char,int> hash,temp;int N;int ok;int ans = 0;
            for(char c:chars)hash[c]++;
            
            for(string str:words){
                temp = hash;
                ok = 1;
                for(char c : str){
                    temp[c]--;
                    if(temp[c] < 0){
                        ok = 0;break;
                    }
                }
                if(ok)ans += str.size();
            }
            return ans;        
        }
    };
    
  • 相关阅读:
    bzoj 4610 Ceiling Functi
    uva 01350
    uva 12075
    uva 01393
    uva 11038
    CF 496E
    CF 496D
    poj 3167
    hdu 4622
    spoj 7258
  • 原文地址:https://www.cnblogs.com/zhangxiaomao/p/11372076.html
Copyright © 2020-2023  润新知