开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情
一、题目描述:
给你一个字符串 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 中的所有字符都是 唯一的
二、思路分析:
数组:
遍历J字符串:用数组(长度设为58,大小写字母的ASCII码从65-122,其中(91-96为标点符号))记录宝石字母,
被认为是宝石的字母,则在相应索引位置赋值为1;
遍历字符串S,若S字符串中的字符在数组中对应的索引位置的值不为0, 则说明该字母是宝石,count++(count记录宝石字母个数)
哈希表:
遍历J字符串:用哈希表记录宝石字母,Key为宝石字母,value默认为0
遍历S字符串:若S字符串的字母出现在哈哈希表的Key中,则该字母为宝石字母,count++;
三、AC 代码:
class Solution {
public int numJewelsInStones(String J, String S) {
//#########数组,耗时1ms,击败99.90%用户
int count = 0;
int[] table = new int[58];
for(int i = 0;i<J.length();i++) {
table[J.charAt(i)-'A']++;
}
for(int i = 0;i<S.length();i++) {
if(table[S.charAt(i)-'A']!=0) {
count++;
}
}
return count;
//##########哈希表,耗时2ms,击败51.65%用户
// int count = 0;
// Map<Character,Integer> jewelHash = new HashMap<>();
// for(int i = 0;i<J.length();i++) {
// jewelHash.put(J.charAt(i), 0);
// }
// for(int i = 0;i<S.length();i++) {
// if(jewelHash.containsKey(S.charAt(i))) {
// count++;
// }
// }
// return count;
}
}
范文参考:
时间消耗还可以,但是内存消耗还是有点多,怎么能在空间复杂度上降低消耗,欢迎指点 - 宝石与石头 - 力扣(LeetCode)