LeetCode 771 宝石与石头

题目要求:给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。

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

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

解法一 分析:
遍历字符串 S,对于 S 中的每个字符,遍历一次字符串 J,如果其和 J中的某一个字符相同,则是宝石。

复杂度分析
时间复杂度:O(mn),其中 m 是字符串 J 的长度,n 是字符串 S 的长度。遍历字符串 S 的时间复杂度是 O(n),对于 S 中的每个字符,需要遍历字符串 J 判断是否是宝石,时间复杂度是 O(m),因此总时间复杂度是 O(mn)。
空间复杂度:O(1)。只需要维护常量的额外空间。

代码如下:

class Solution {
public:
    int numJewelsInStones(string J, string S) 
    {
        int jewelsCount = 0;
        int jewelsLength = J.length(), stonesLength = S.length();
        for (int i = 0; i < stonesLength; i++) 
        {
            char stone = S[i];
            for (int j = 0; j < jewelsLength; j++) 
            {
                char jewel = J[j];
                if (stone == jewel) 
                {
                    jewelsCount++;
                    break;
                }
            }
        }
        return jewelsCount;
    }
};

①:

jewelsLength = J.length()

c/c++中 strlen(str)和str.length()和str.size()都可以求字符串长度。
其中str.length()和str.size()是用于求string类对象的成员函数
strlen(str)是用于求字符数组的长度,其参数是char*。

第二天自己敲啦!发现小毛病如下:

1、

jewelsLength = J.length();

这里理所当然认为是 J ,再看代码发现题目定义的并不是 J 而是 jewels ,写题目注意上下一致不要想当然呀!

2、

for (int i = 0; i < stonesLength; i++)

这里忘记对 i 进行定义,即使只在循环条件里出现也不要忘记定义呀!
而且!!!中间是分号呀,又是被菜哭的一天。不是分号的话会被认为是重复再定义

3、

char stone = S[i];

这里也要记得定义一下stone。(头大,老是忘记定义一些变量,而且它是char类型!)
而且 !!!这里表示字符串中的一个字符时,中间不加点,是长 S[ i ] 这样,瞅了好久…

4、

return jewelsCount;

最后要记得有返回值呀!!(报错了才发现,最后没写这一行…)

好啦,最后终于成功了~(附上自己敲的代码)

class Solution {
public:
    int numJewelsInStones(string jewels, string stones) {
        int JewelsCount = 0;
        int Jewelsnum = jewels.length();
        int Stonesnum = stones.length();
        for(int i=0; i<Stonesnum; i++)
        {
            char stone = stones[i];
            for(int j=0; j<Jewelsnum; j++)
            {
                char jewel = jewels[j];
                if(stone == jewel)
                {
                    JewelsCount++;
                }
            }
        }
        return JewelsCount;
    }
};

解法二 哈希集合 分析
方法一中,对于字符串 S 中的每个字符,都需要遍历一次字符串 J,导致时间复杂度较高。如果使用哈希集合存储字符串 J 中的宝石,则可以降低判断的时间复杂度。
遍历字符串 J,使用哈希集合存储其中的字符,然后遍历字符串 S,对于其中的每个字符,如果其在哈希集合中,则是宝石。

复杂度分析
时间复杂度:O(m+n),其中 m 是字符串 J 的长度,n 是字符串 S 的长度。遍历字符串 J 将其中的字符存储到哈希集合中,时间复杂度是 O(m),然后遍历字符串 S,对于 S 中的每个字符在 O(1) 的时间内判断当前字符是否是宝石,时间复杂度是 O(n),因此总时间复杂度是 O(m+n)。
空间复杂度:O(m),其中 m 是字符串 J 的长度。使用哈希集合存储字符串 J 中的字符。

代码如下:

class Solution {
public:
    int numJewelsInStones(string J, string S) {
        int jewelsCount = 0;
        unordered_set<char> jewelsSet;
        int jewelsLength = J.length(), stonesLength = S.length();
        for (int i = 0; i < jewelsLength; i++) {
            char jewel = J[i];
            jewelsSet.insert(jewel);
        }
        for (int i = 0; i < stonesLength; i++) {
            char stone = S[i];
            if (jewelsSet.count(stone)) {
                jewelsCount++;
            }
        }
        return jewelsCount;
    }
};

①:

jewelsSet.insert(jewel);

insert() 函数有以下三种用法:
1、在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
2、在指定位置loc前插入num个值为val的元素
3、在指定位置loc前插入区间[start, end)的所有元素

②:

unordered_set<char> jewelsSet;

C++代码,用STL中的unordered_set存储一下J中数据

(第二天每日一题,拿到题目还是不会写,感觉菜菜的,啥时候我也能动手敲代码如有神呀!好了,真的困,午安吧~)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值