topic
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.
Conventional thinking
The title may be a bit around, in fact, to simplify it, that there are two strings J
and S
, two strings are composed of letters, and is case sensitive, but J
in the letter is not repeated, S
it is possible to duplicate. Please find out S
there how many letters are in the J
same letter.
The idea is very simple, is to walk S
in each character exists in the J
middle, on each there is a cumulative time. code show as below:
class Solution {
public int numJewelsInStones(String J, String S) {
int count = 0;
for (int i = 0; i < S.length(); i++) {
if (J.indexOf(S.charAt(i)) >= 0)
count++;
}
return count;
}
}
Another way
In discussing the district saw a very Sao practice, only one line of code can get the desired results, as follows:
class Solution {
public int numJewelsInStones(String J, String S) {
return S.replaceAll("[^" + J + "]", "").length();
}
}
This idea is the use of regular expressions, the S
inside who do not belong to the J
character to replace all the empty string ""
length, and then the rest of the string is the final answer.
As these two ideas matter of opinion which is better, here are two ideas each time and memory it takes:
Conventional ideas:
Runtime: 1 ms
Memory Usage: 33.7 MB
Special ideas:
Runtime: 7 ms
Memory Usage: 34.9 MB