1、题目
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
Note:
S and J will consist of letters and have length at most 50.
The characters in J are distinct.
首先就是暴力破解法,两个循环。代码如下:
public int numJewelsInStones(String J, String S) {
int n = 0;
char[] arr = J.toCharArray();
int len = arr.length;
for(int i=0;i<len;i++){
for(int j=0;j<S.length();j++){
if(arr[i] == S.charAt(j)){
n++;
}
}
}
return n;
}
一般,题目中出现可以使用暴力破解法的时候,一般都可以通过使用空间换时间来减少时间复杂度。最经典的当然是Hash相关:
public int numJewelsInStones(String J, String S) {
int n = 0;
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
for(int i=0;i<S.length();i++){
char t = S.charAt(i);
if(map.containsKey(t)){
map.put(t,map.get(t) + 1);
}else//开始我把else给忘记了,导致下面总是被执行,出错
map.put(S.charAt(i),1);
}
for(int i=0;i<J.length();i++){
if(map.containsKey(J.charAt(i)))
n += map.get(J.charAt(i));
}
return n;
}
注意:HashMap的初始化以及它的一些常用API。
注意:我在HashMap中存储的是后面那一个字符串S,由于S中的字母可能相同,所以在value中存储了每个字母出现的次数!
题目中已经说明,第一个字符串中的字母是distinct的,这明显告诉要使用HashMap来存储第一个字符串的值,用第二个字符串进行比较。