原文链接:771. 宝石与石头 - 力扣(LeetCode)
题目
给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
字母区分大小写,因此 "a" 和 "A" 是不同类型的石头。
示例 1:
输入:jewels = "aA", stones = "aAAbbbb"
输出:3
示例 2:
输入:jewels = "z", stones = "ZZ"
输出:0
提示:
1 <= jewels.length, stones.length <= 50
jewels 和 stones 仅由英文字母组成
jewels 中的所有字符都是 唯一的
题解
方法一:
解题思路:用set存放宝石,遍历石头中的元素,查看set中是否存在
时间:1ms 空间:40.1MB
class Solution {
public int numJewelsInStones(String jewels, String stones) {
//定义一个set集合,用于存放宝石的种类
HashSet<Character> jewel = new HashSet<>();
int res=0;//定义结果
//循环将宝石放入集合
for(int i=0;i<jewels.length();i++){
jewel.add(jewels.charAt(i));
}
//遍历石头,如果找到存在集合中的宝石,则结果+1
for(int j=0;j<stones.length();j++){
if(jewel.contains(stones.charAt(j)))
res++;
}
return res;
}
}
方法二:
解题思路:用数组记录拥有的宝石,然后遍历stone
时间:0ms 空间:40MB
class Solution {
public int numJewelsInStones(String jewels, String stones) {
//定义一个正数数组,记录存在的宝石种类
int[] ans = new int[58];
for(int i=0;i<jewels.length();i++){
//每一个位置对应一个宝石,存在时将该位置设置为1
ans[jewels.charAt(i)-'A']=1;
}
//当前情况,宝石位置都为1,其余位置都为0
int res = 0;
for(int j=0;j<stones.length();j++){
//判断石头中的元素存在于宝石数组中,则+1,否则+0
res+=ans[stones.charAt(j)-'A'];
}
return res;
}
}
方法三:
解题思路:双重循环
时间:0ms 空间:39.7MB
class Solution {
public int numJewelsInStones(String jewels, String stones) {
int res = 0;
for (int i = 0; i < stones.length(); i++) {
char stone = stones.charAt(i);
for (int j = 0; j < jewels.length(); j++) {
char jewel = jewels.charAt(j);
if (stone == jewel) {
res++;
break;
}
}
}
return res;
}
}