5

ちょっと私は現在このコードを持っています。ユーザーは文字列を配列に入力できますが、上限は 5 です。配列を使用して、配列から単語を形成する予定です。どうすればこれを達成できますか?

    const int row = 5;
    char array[row];
    char count = 0;
    char letter;
    while (count < 5)
    {
        cout << "Enter a letter: ";
        cin >> letter;
        array[count] = letter;
        count++;
    }
    cout << "Letter inputed" << endl;
    for (count = 0; count < 5; count++)
    {
        cout << array[count] << " " <<  endl;
    }
    system("pause");
4

3 に答える 3

3

正しい軌道に乗るためのヒントを次に示します。これが 1 回か 2 回しか使用しないものでない限り、使用を検討std::next_permutationすることさえしないでください (実際には、正しく作業するよりも複雑であるため、おそらく使用することはありません)。

を使用するstd::next_permutationと、関数はおよそ N! 必要以上に遅い1 -- 5 文字の場合、120 倍遅くなり、長い単語を使用すると、すぐに悪化します(たとえば、10 文字の場合は 350 万を超えます)。

代わりに、辞書を前処理することから始めます。std::set<std::string>単語の代わりにstd::map<std::string, std::vector<string>>(またはstd::unordered_map、英語には十分な単語が少ないため、おそらく大きな違いはないでしょう) を作成します。辞書から単語を読み取るときに、その文字列のソート済みバージョンを作成します。それをキーとして使用し、元のバージョンの単語をそのキーのベクトルにプッシュします。

次に、ユーザーから単語を取得したら、それを並べ替え、マップで調べます。関連付けられたベクトルには、それらの文字から作成できるすべての単語が (辞書から) 含まれます。


1.std::mapの代わりにを使用すると、 のstd::unordered_mapようN!/(log N)になるはずですが、N!非常に速くlog N成長し、非常に遅く成長するため、違いは無視できます (ログ N = 3 に十分な大きさの N を取得すると、N! は非常に大きくなり、N! /log N の計算ステップ...さて、宇宙はそれ以前に熱による死があったかどうかなど、宇宙論の問題に取りかかり始めます (答えは「はい、おそらく」のようです)。

于 2013-10-24T16:07:13.003 に答える