给定字符串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.哈希表
这个地方没怎么学过,去补一下。