LeetCode—771. 宝石与石头

该博客讨论了LeetCode上的771题——宝石与石头,主要介绍了如何利用unordered_set和哈希表来优化解决方案,降低时间复杂度。博主分享了自己的初始思路以及遇到的问题,并引用了其他大佬的操作方法,包括使用unordered_set进行优化,但实际运行时间并未如预期降低。此外,博主还提到了需要进一步学习哈希表的知识。

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

给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S
中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。

示例 1:

输入: J = “aA”, S = “aAAbbbb” 输出: 3 示例 2:

输入: J = “z”, S = “ZZ” 输出: 0 注意:

S 和 J 最多含有50个字母。 J 中的字符不重复。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/jewels-and-stones
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的实现

思路感觉很简单,二重循环,但是这样时间复杂度一定是可以优化的。

class Solution {
public:
    int numJewelsInStones(string J, string S) {
        int num=0;
        int lenj=J.length(),lens=S.length();        
        for(int i=0;i<lens;i++)
        {
            for(int j=0;j<lenj;j++)
            {
                if(J[j]==S[i])
                {
                    num++;
                    break;
                }
            }
        }       
        return num;
    }
};

又想,大小写字母一共才52个,可不可以统计各种石头的数量,再把宝石的数量加起来。

class Solution {
public:
    int numJewelsInStones(string J, string S) {
        int num=0;
        int lenj=J.length(),lens=S.length();        
        int allNum[58]={0};
        for(int i=0;i<lens;i++)
        {
            allNum[S[i]-65]++;
        }
        for(int j=0;j<lenj;j++)
        {
            num+=allNum[J[j]-65];
        }
        return num;
    }
};

然后运行时间没变。。。不应当啊,时间复杂度从O(n^2)变成O(n)了啊。
leetcode暂时打不开了,下楼买饮料去了。
去找了另一位的,虽然他称运行是4s,但是代码直接copy过来还是8s

大佬操作

思路
把宝石类型J记录进set中,用count函数一块块鉴定所拥有的石头是否属于set内的任意一个。若是,ans加一。

    int numJewelsInStones(string J, string S) {
        int ans = 0;
        unordered_set<char> jew;
        for(auto i : J) jew.insert(i); //记录宝石类型
        for(auto s : S) if(jew.count(s))    ++ ans; //若拥有的石头里有宝石,答案加一
        return ans;
    } };

作者:youlookdeliciousc
链接:https://leetcode-cn.com/problems/two-sum/solution/cxiang-xi-ti-jie-ji-jian-by-youlookdeliciousc/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.unordered_set容器

https://www.cnblogs.com/LearningTheLoad/p/7565694.html

2.哈希表

这个地方没怎么学过,去补一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值