题目
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。
思路
利用一个set容器来存放宝石种类,然后遍历S,每次都去set里面寻找有没有这个种类的宝石,有就自增1
代码
import java.util.HashSet;
class Solution {
public int numJewelsInStones(String J, String S) {
int count=0;
HashSet<Character>set=new HashSet<Character>();
for (int i=0;i<J.length();++i)
{
set.add(J.charAt(i));
}
for (int i=0;i<S.length();++i)
{
if (set.contains(S.charAt(i)))++count;
}
return count;
}
}
结果
这个算法,没有什么杰出的地方,也是一个很烂的算法,就是利用了一个set容器的特性而已
思路
利用两个for循环,因为一个宝石只能对应一种类型,只要取出每一个宝石,跟里面所有的类型比较一遍,有的话就自增,而且在相同之后,可以直接break,因为一种宝石只有一种类型。
代码
class Solution {
public int numJewelsInStones(String J, String S) {
int count=0;
char c;
char d;
//最好这里的S和J的长度要先计算出来,不用每次循环都去计算,利用空间换时间,长度短的循环还好一点,如果长度太长了,这样每次都要计算长度,时间花销会增大很多。
for (int i=0;i<S.length();++i)
{
c=S.charAt(i);
for (int j=0;j<J.length();++j)
{
d=J.charAt(j);
if (c==d)
{
++count;
break;//一种宝石只有一种类型
}
}
}
return count;
}
}
结果
时间和内存消耗的都比上一个解法少,看来暴力也就不一定那么不好!
大佬思路
看到了利用HashMap来解题,不过c++利用起来很方便,但是Java因为用法更c++不同,甚至还要稍微逊色于第二种解法。就是将每一个字符和一个数值存储在hashmap中,到时候,只要取hashmap中那些对应宝石就可以知道个数了
代码
import java.util.HashMap;
class Solution {
public int numJewelsInStones(String J, String S) {
int count=0;
HashMap<Character,Integer>hashMap=new HashMap<Character, Integer>();
char c;
int j;
for (int i=0;i<S.length();++i)
{
c=S.charAt(i);
if (hashMap.containsKey(c))//如果里面已经有了这个键
{
j=hashMap.get(c);//取出来数值
++j;//自增1
hashMap.put(c,j);//再放回去
}
else//如果是没有的话,先放进去一个
{
j=1;
hashMap.put(c,j);
}
}
for (int i=0;i<J.length();++i)
{
c=J.charAt(i);
if (hashMap.get(c)!=null)
count+=(int)hashMap.get(c);
}
return count;
}
}
结果
java的用法没有c++那么方便,所以,c++能达到双百的解法,这边搞不了,甚至还有点慢和占内存!