原问题:
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".
Note:
• S and J will consist of letters and have length at most 50.
• The characters in J are distinct.
直接查找求解:
//max_n1为J数组的最大长度,max_n2为S数组的最大长度
int JewelsNum_1(const char *J,int max_n1,const char *S,int max_n2)
{
int i = 0,j,num=0;
while(S[i]!='\0' && i<max_n2)
{
j = 0;
while(J[j]!='\0' && j<max_n1)
{
if(S[i] == J[j])
{
num++;
break;
}
j++;
}
i++;
}
return num;
}
哈希查找求解:
int JewelsNum_2(const char *J,int max_n1,const char *S,int max_n2)
{
int i = 0,num=0,all[52] = {
0
};
char temp = '\0';
temp = S[i];
while(temp!='\0' && i<max_n2)
{
if(temp>='a' && temp<='z')
{
all[temp-'a']++;
}
else if(temp>='A' && temp<='Z')
{
all[temp-'A'+26]++;
}
else;
i++;
temp = S[i];
}
i = 0;
temp = J[i];
while(temp!='\0' && i<max_n1)
{
if(temp>='a' && temp<='z')
{
num = num + all[temp-'a'];
}
else if(temp>='A' && temp<='Z')
{
num = num + all[temp-'A'+26];
}
else;
i++;
temp = J[i];
}
return num;
}
总结:
直接查找算法最坏情况下的时间复杂度为m*n,哈希算法最坏情况下的时间复杂度为m+n。