Question
You’re given strings J representing the types of stones that are jewels, and S representing the stones you have. Each character in S is a type of stone you have. You want to know how many of the stones you have are also jewels.
The letters in J are guaranteed distinct, and all characters in J and S are letters. Letters are case sensitive, so “a” is considered a different type of stone from “A”.
Example 1
Input: J = “aA”, S = “aAAbbbb”
Output: 3
Example 2
Input: J = “z”, S = “ZZ”
Output: 0
Solution 1:
By using HashMap
Solution 2:
public int numJewelsInStones(String J, String S) {
return S.replaceAll("[^" + J + "]", "").length();
}
Note:
[^ + J + ] will select all characters in S that is not in J, and the second parameter will replace all those characters with “”.
Solution 3:
class Solution {
public int numJewelsInStones(String J, String S) {
if(S.length() == 0 || J.length() == 0)
return 0;
int[] dict = new int[122];
for(char stone: S.toCharArray()){
dict[stone]++;
}
int res = 0;
for(char jewel: J.toCharArray()){
res = res + dict[jewel];
}
return res;
}
}
Note
The following statement is cited:
至于为什么用了一个int数组而不是hash table,而且是固定size,
(1)因为题目说石头们只有letters,区分大小写,那么一共52只
(2)这个地方其实可以用hashtable,但是用hashtable的话每次traverse一个宝石的时候会先去找这个key value pair存在哪里(如果hashtable是用array和linkedlist实现的话,极端情况会出现一个array后面跟了好长一串linkedlist,严重影响性能, worst case O(n)),所以为了方便起见,可以直接用 character-‘a’ 来算key value pair的位置,比如说现在traverse到了b,那么’b’ - ‘a’ = 1 所以b在数组里的第二个位置,可以直接访问到!非常快always O(1)