元の質問:
宝石である石の種類を表す文字列 J と、所有している石を表す文字列 S が与えられます。Sの各文字はあなたが持っている石の種類です。あなたが持っている石のうち、宝石も何個あるか知りたいと思います。
J の文字は区別されることが保証されており、J と S の文字はすべて文字です。文字は大文字と小文字が区別されるため、「a」は「A」とは異なる種類の石とみなされます。
注:
• S と J は文字で構成され、長さは最大 50 です。
• J の文字は区別されます。
解決策を直接見つけます。
//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です。