特定の文字統計のための 2 つのアルゴリズム

元の質問:

宝石である石の種類を表す文字列 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です。

おすすめ

転載: blog.csdn.net/g1093896295/article/details/83117638