指定された長さの辞書編集文字列を生成する方法は?
長さ N の文字列 (辞書式順序) を辞書式順序で生成するアルゴリズムを探しています。たとえば、長さが 1 の場合、生成される文字列は次のとおりです。"a"、"b"、"c"、"d"、"e"、"f"、g、h、i、j、k...、z .
長さ 2 の場合、生成される文字列は次のようになります: "aa","ab","ac","ad",...,"ba","bb",...,"zz".
どうすればこれを行うことができますか?
これが私がやったことです:
void permute(string a, int i, int n, int length)
{
int j;
if (i == length){
string cand = a.substr(0,length);
cout<<cand<<endl;
}
else
{
for (j = i; j <= n; j++)
{
swap((a[i]), (a[j]));
permute(a, i+1,n,length);
swap((a[i]), (a[j]));
}
}
}
「permute(a,0,a.size(),1)」を呼び出している間、文字列 a は次のようになります。
aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbccccccccccccccccccccddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffgggggggggggggggggggghhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkkkkkkkllllllllllllllllllllmmmmmmmmmmmmmmmmmmmmnnnnnnnnnnnnnnnnnnnnooooooooooooooooooooppppppppppppppppppppqqqqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrssssssssssssssssssssttttttttttttttttttttuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzz
正しい出力を生成しますが、辞書式文字列を繰り返しています。アルファベットだけに減らすと、「aa」、「aaaa」などの文字列が見落とされると思います。では、どうすればこれを回避できますか?何かアイデアはありますか?