问题:
给定字符串J
代表石头中宝石的类型,和字符串 S
代表你拥有的石头。 S
中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J
中的字母不重复,J
和 S
中的所有字符都是字母。字母区分大小写,因此"a"
和"A"
是不同类型的石头。
解析:
本题是简单的搜索,最容易想到的是暴力求解,将S中每个字母和J中的做比较:
public int numJewelsInStones(String J, String S) {
char a[]=J.toCharArray();
int count=0;
for(int i=0;i<S.length();i++)
{
for(int j=0;j<J.length();j++)
{
if(S.charAt(i)==a[j])
{
count++;
break;
}
}
}
return count;
}
但是提交的记录中用时最短的程序使用了计数排序这个方法:定义一个数组,长度为J字符串中可能出现的字符的数量,将字符的值作为数组索引,若J字符中存在某个字符,则这个字符对应的数组的值为1,不存在即为0。这种方法牺牲了空间换来了时间:
public int numJewelsInStones(String J, String S) {
int result = 0;
char[] s = new char[128];
for (char c : S.toCharArray()) {
s[c]++;
}
for (char j : J.toCharArray()) {
result += s[j];
}
return result;
}