私のアイデアは Rahul Tripathi のアイデアと似ていますが、重複した要素に対して適切に機能するようにするためにトリッキーなことをしました。スワップ操作を行う前にはいつでも、この要素が以前に表示されたかどうかを確認するために振り返ります。要素が重複している場合は、スワップ操作を行うべきではありません。コードは以下の C++ を使用したものです。
#include<iostream>
using namespace std;
bool isDupilicate(char input[],int start,int j)
{
bool ret=false;
for(int i=start;i<j;++i)
{
if(input[i]==input[j])
{
ret=true;
break;
}
}
return ret;
}
void swap(char& a,char &b)
{
char temp=a;
a=b;
b=temp;
}
void permutation(char input[],int start,int length)
{
if(start==length)
{
for(int i=0;i<length;++i)cout<<input[i];
cout<<endl;
}
else
{
for(int i=start;i<length;++i)
{
if(isDupilicate(input,start,i))continue;
swap(input[i],input[start]);
permutation(input,start+1,length);
swap(input[i],input[start]);
}
}
}
int main()
{
cout<<"Input for abb"<<endl;
char input[3]={'a','b','b'};
permutation(input,0,3);
cout<<"________________"<<endl;
cout<<"Input for abc"<<endl;
input[2]='c';
permutation(input,0,3);
getchar();
getchar();
}
このリンクをチェックして、作成できるユニークなパターンの数を確認してください! それが役に立てば幸い!