1002——查找常用字符——简单

这篇博客探讨了一种寻找多个字符串交集字母的算法,通过计数排序和遍历每个字符串来实现。文章指出,最坏情况下的时间复杂度为O(MN),但通过优化可以达到O(M(N+26))。方法是遍历每个字符串并记录每个字母出现的次数,然后找出所有字符串中每个字母的最小出现次数,最后根据这个最小次数构建交集字母的集合。该算法适用于处理大量字符串的情况。

在这里插入图片描述
这道题要找出所有字符串中的交集字母,最简单你也得全部遍历一遍才可以,所以这道题的时间复杂度至少为O(MN),M为字符串个数,N为字符串平均长度。
但是除此之外,字母共有26个,所以最小的时间复杂度应为O(M
(N+|e|)),|e|为字符个数,此处为26。
我们将每个字符串都遍历一遍,并将其中的字母进行计数排序,每遍历完一个字符串后,我们还要去汇总总的26个字母目前分别出现的最小次数。当字符串全部遍历完成后,根据26个字母出现的最小次数,就可以将字母添加进容器中。最后返回容器即可。

class Solution {
public:
    vector<string> commonChars(vector<string>& A) {
        int l = A.size();
        vector<int> ans(26, 100);
        vector<string> v;
        for(int i = 0; i < l; ++ i) {
            int len = A[i].length();
            int a[26] = {0};
            for(int j = 0; j < len; ++ j)
                a[A[i][j] - 'a']++;
            for(int i = 0; i < 26; ++ i)
                ans[i] = ans[i] < a[i] ? ans[i] : a[i];
        }
        for(int i = 0; i < 26; ++ i) {
            while(ans[i] --) v.emplace_back(1, i + 'a');
        }
        return v;
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿扬来了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值