题目要求:给定字符串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中数据
(第二天每日一题,拿到题目还是不会写,感觉菜菜的,啥时候我也能动手敲代码如有神呀!好了,真的困,午安吧~)