题目地址:https://leetcode-cn.com/problems/jewels-and-stones/submissions/
给定字符串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字符串中找到j字符串中出现过的字符。所有字符串中只会有字母,区分大小写,且j中的字符不重复s中的字符重复。(50个字母其实不需要管他)
一、爆破法
我们的思路很简单,先遍历s中的字符,给数组中对应的下标的值++
最后再根据j中的字符串,遍历数组,+数组内容后返回
执行结果如下:
255 / 255 个通过测试用例
状态:通过
执行用时: 1 ms
内存消耗: 36.5 MB
public static int numJewelsInStonesMe(String jewels, String stones) {
int[] arrayLower = new int[26];
int[] arrayUpper = new int[26];
int ans = 0;
for (int i = 0; i < stones.length(); i++) {
char a = stones.charAt(i);
if (a > 90) {
arrayLower[a - 'a']++;
} else {
arrayUpper[a - 'A']++;
}
}
for (int i = 0; i < jewels.length(); i++) {
char a = jewels.charAt(i);
if (a > 90) ans += arrayLower[a - 'a'];
else ans += arrayUpper[a - 'A'];
}
return ans;
}
我们的方法拿到了几乎双百,时间100和内存95.但我在评论区找不到更好的办法了
这里贴出官方的另一个方法,虽然双标准都很低。。。
二、官方set法
官方的方法是将j的字符存入set中,然后遍历s,如果存在则++不存在则继续
执行结果如下:
255 / 255 个通过测试用例
状态:通过
执行用时: 2 ms
内存消耗: 36.7 MB
public int numJewelsInStones(String jewels, String stones) {
int jewelsCount = 0;
Set<Character> jewelsSet = new HashSet<Character>();
int jewelsLength = jewels.length(), stonesLength = stones.length();
for (int i = 0; i < jewelsLength; i++) {
char jewel = jewels.charAt(i);
jewelsSet.add(jewel);
}
for (int i = 0; i < stonesLength; i++) {
char stone = stones.charAt(i);
if (jewelsSet.contains(stone)) {
jewelsCount++;
}
}
return jewelsCount;
}
总的来说这道题的思路还是蛮简单的,只是不知道为什么拿不到双百,这里还是需要努力看看有没有别的思路。