美文网首页
leetcode916 单词子集

leetcode916 单词子集

作者: 奥利奥蘸墨水 | 来源:发表于2020-04-07 23:40 被阅读0次

    题目

    单词子集

    分析

    根据题意,题目中给出了两个集合A和B,B中的单词为b,B中的每个b都是A中某个a的子集,那么a就叫通用单词。

    例子1:a = "abc" B = {"a", "b"},"a"和"b"都是"abc"的子集,那么a是通用单词。
    例子2:a = "abc" B = {"aa", "b"},"aa"不是"abc"的子集,那么a不是通用单词。

    通过上述例子我们可以发现,a至少要包含B中每个字母出现的最小次数,a才能是通用单词。

    所以解法很简单,求一遍B中每个字母出现的最小次数,然后再遍历A中每个单词做判断即可。

    代码

    class Solution {
    private:
        vector<int> get_vec(string& s) {
            vector<int> res(26, 0);
            for (auto & c : s) {
                res[c - 'a']++;
            }
            return res;
        }
    
        void merge_vec(vector<int>& A, vector<int>& B) {
            for (int i = 0; i < 26; i++) {
                A[i] = (B[i] > A[i]) ? B[i] : A[i]; 
            }
        }
    
        bool check(vector<int>& A, vector<int>& B) {
            for (int i = 0; i < 26; i++) {
                if (B[i] > A[i]) {
                    return false;
                }
            }
            return true;
        }
    public:
        vector<string> wordSubsets(vector<string>& A, vector<string>& B) {
            vector<int> num_B(26, 0);
            for (auto & str : B) {
                vector<int> vec(get_vec(str));
                merge_vec(num_B, vec);
            }
    
            vector<string> res;
            for (auto & str : A) {
                vector<int> vec(get_vec(str));
                if (check(vec, num_B)) {
                    res.push_back(str);
                }
            }
    
            return res;
        }
    };
    

    相关文章

      网友评论

          本文标题:leetcode916 单词子集

          本文链接:https://www.haomeiwen.com/subject/rzuaphtx.html