3

文字列の順列を生成するが、重複するケースを削除する一般的なプログラムを作成しました。このために、私は を使用して暗記を使用しています。

void permute(char *a,int i, int n,set<char*> s)
{
    if(i==n)
    {
        if(s.find(a)==s.end()){
            cout<<"no dublicate"<<endl;
            cout<<a<<endl;
            s.insert(a)
        }
    }
    else{
        for(int j=i;j<n;j++)
        {
            swap(a[i],a[j]);
            permute(a,i+1,n,s);
            swap(a[i],a[j]);
        }
    }
}

int main()
{
    char a[]="aba";
    set <char*> s;
    permute(a,0,3,s);
    return 0;
}

しかし、結果は望みどおりではありません。すべての順列を出力します。誰でも問題を理解するのを手伝ってくれますか。

4

1 に答える 1

3

まず、set<> sパラメーターを値で渡します。これにより、各挿入が破棄されます。これは、ローカル コピーsのみで行われるためです。ただし、参照渡しに変更しても、同じ char* 値を挿入するたびに挿入が 1 回しか行われないため、機能しません。コードを正しく機能させるには、関数のプロトタイプを次のように変更することをお勧めします

void permute(string a,int i, int n,set<string>& s)

これで問題なく動作します。

更新:マイナーな変更が記述されたソース コード

void permute(string a,int i, int n,set<string>& s)
{
    if(i==n)
    {
        if(s.find(a)==s.end()){
            cout<<"no dublicate"<<endl;
            cout<<a<<endl;
            s.insert(a);
        }
    }
    else{
        for(int j=i;j<n;j++)
        {
            swap(a[i],a[j]);
            permute(a,i+1,n,s);
            swap(a[i],a[j]);
        }
    }
}

int main()
{
    string a ="aba";
    set <string> s;
    permute(a,0,3,s);
    return 0;
}
于 2013-03-22T06:10:04.270 に答える