• Jewels and Stones


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

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

    示例 1:

    输入: J = "aA", S = "aAAbbbb"
    输出: 3
    

    示例 2:

    输入: J = "z", S = "ZZ"
    输出: 0
    

    注意:

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

    执行用时 : 4 ms, 在Jewels and Stones的C++提交中击败了99.91% 的用户
    内存消耗 : 8.2 MB, 在Jewels and Stones的C++提交中击败了90.03% 的用户

    开个定长52的新数组
    遍历S把52个字母出现的次数都存下来(下面的第一个for循环)
    这样对于J中的每一个宝石都可以直接拿到其数量,然后挨个加起来就行了

    int numJewelsInStones(string J, string S) 
    {
        //771st
        int amount[52] = { 0 };
        int ans = 0;
        for (int i = 0; i < S.size(); i++)
        {
            if (S[i] >= 'a')
                amount[S[i] - 'a']++;
            else
                amount[S[i] - 'A' + 26]++;
        }
        for (int i = 0; i < J.size(); i++)
        {
            if (J[i] >= 'a')
                ans += amount[J[i] - 'a'];
            else
                ans += amount[J[i] - 'A' + 26];
        }
        return ans;
    }
    

    一个set或者multiset就OK了,string也有find函数

    class Solution {
    public:
    	int numJewelsInStones(string J, string S) {
    		set<int> s;
    		for (int i = 0; i < J.length(); i++){
    			s.insert(J[i]);
    		}
    		int count = 0;
    		for (int i = 0; i < S.length(); i++){
    			if (s.find(S[i]) != s.end())
    				count++;
    		}
    		return count;
    	}
    };
    
    class Solution {
    public:
    	int numJewelsInStones(string J, string S) {
    		multiset<int> s;
    		for (int i = 0; i < S.length(); i++){
    			s.insert(S[i]);
    		}
    		int count = 0;
    		for (int i = 0; i < J.length(); i++){
    			count += s.count(J[i]);
    		}
    		return count;
    	}
    };
    
    class Solution {
    public:
    	int numJewelsInStones(string J, string S) {
    		int count = 0;
    		for (int i = 0; i < S.length(); i++){
    			if (J.find(S[i]) != J.npos)
    				count++;
    		}
    		return count;
    	}
    };
    

    题目解释
    一种字母就是一种石头(一个字母的大小写当作不同石头)

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

    class Solution {
    public:
        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;
        }
    };
    

    [1] 771. 宝石与石头 - 力扣(LeetCode)
    [2] C++,新开定长52的数组实现(其实是受387题启发),时间复杂度O(n),空间复杂度O(1) - 宝石与石头 - 力扣(LeetCode)
    [3] 一个set或者multiset就OK了,string也有find函数 - 宝石与石头 - 力扣(LeetCode)
    [4] C++详细题解,极简 - 宝石与石头 - 力扣(LeetCode)

  • 相关阅读:
    webIDE 第二篇博文
    前端第一天
    记昨天
    入职第四天
    入职第二天
    linux常用命令,自己总结
    一切从头开始
    在服务器上搭建SVN
    Dynamic CRM 365学习历程--JS
    Dynamic CRM 365学习历程--有关CRM的学习过程种需要注意的事项
  • 原文地址:https://www.cnblogs.com/linweilin/p/11443498.html
Copyright © 2020-2023  润新知