5

この目的のために特別なことは何も見つかりませんでした。

文字列内の各文字の出現をカウントする関数を見つけようとしています。これにより、長さから最後にそれらを引き出して、その文字列で使用されている同種の文字の数を見つけることができます。

ネストされたループで試しました。最初に適用し、2番目に文字列をスキャンし、文字列の他の場所に表示されない場合は条件付きで文字を満たします:

size_t CountUniqueCharacters(char *str)
{
    int i,j;
    char unique[CHAR_MAX];
    for(i=strlen(str); i>=0; i--)
    {
        for(j=strlen(str); j>=0; j--)
        {
            if(str[i] != unique[j])
                unique[j] = str[i];
        }
    }
    return strlen(unique);
}

これはうまくいきませんでした。

これは、 などの怠惰な名前の入力を誰かに制限したい場合に便利です"aaaaaaaaaaaaa"

4

9 に答える 9

6

この方法はO(n^2)複雑ですが、O(n).

int CountUniqueCharacters(char* str){
    int count = 0;

    for (int i = 0; i < strlen(str); i++){
         bool appears = false;
         for (int j = 0; j < i; j++){
              if (str[j] == str[i]){
                  appears = true;
                  break;
              }
         }

         if (!appears){
             count++;
         }
    }

    return count;
}

このメソッドは、文字列内のすべての文字を反復処理します。文字ごとに、その文字が前の文字のいずれかに含まれているかどうかを確認します。そうでない場合、文字は一意であり、カウントがインクリメントされます。

于 2014-07-04T11:32:31.663 に答える
3

個別の文字を数える次の方法は、非常にシンプルでO(n). ここでのロジックは、文字配列をトラバースするだけで、文字ごとに count を作成し1、たとえそれが繰り返されたとしても、値を1only で上書きするだけです。トラバースが完了したら、すべての文字の出現を合計します。

int count_distinc_char(const char *a){
     int c_arr[MAX_CHAR] = {0};
     int i, count = 0;
     for( i = 0; a[i] != '\0'; i++){
         c_arr[a[i] - 'a'] = 1;
     }    
     for( i = 0; i < MAX_CHAR; i++){
         count += c_arr[i];
     }
     return count;
}
于 2019-07-05T03:07:20.790 に答える
1

次のように、ノード構造を使用して、文字列で見つかった文字とその発生を格納するリンク リストを作成します。

struct tagCharOccurence 
{
    char ch;
    unsigned int iCount;
};

文字列内のすべての文字を 1 つずつ読み取り、1 文字を読み取ったときに、リンク リストに存在するかどうかを確認します。存在する場合はその数を増やし、リンク リストに文字が見つからない場合は、「ch」を使用して新しいノードを挿入します。 ' 文字を読み取るように設定し、カウントを 1 に初期化します。

このようにして、各文字の出現回数を 1 回のパスでのみ取得します。リンクされたリストを使用して、遭遇した回数だけ文字を印刷できるようになりました。

于 2014-07-04T11:40:15.937 に答える
1

C++ を使用している場合、最適な時間の複雑さを持つワンライナーを次に示します。

int numUniqeChars = std::unordered_set<char>(std::begin(str), std::end(str)).size();

于 2021-09-27T03:15:17.613 に答える