我正在尝试使用 26 个字母(仅相当于 26*25*24=15,600)来计算所有可能的 3 个字母排列。字母的顺序很重要,我不想重复字母。(我希望按字典顺序生成排列,但这不是必需的)
到目前为止,我尝试嵌套for
循环,但最终我遍历了所有可能的组合。所以有重复的字母,这是我不想要的,for
如果我想要超过 3 个字母,循环会变得难以管理。
我可以翻阅这些字母,直到我得到一个没有使用过的字母,但它不是按字典顺序排列的,而且它比使用慢得多next_permutation
(我不能使用这种std
方法,因为我要计算的所有子集26 个字母)。
有没有更有效的方法来做到这一点?从效率低下的角度来看,next_permutation
立即迭代前 6 位数字。然而,使用这种方法获得所有三个字母排列需要几秒钟,并且next_permutation
对于我必须计算的 2^n 个子集,仍然很快变得低效。
这是嵌套for
循环的内容:
char key[] = {'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','r','s','t','u','v','w','x','y','z'};
bool used[25];
ZeroMemory( used, sizeof(bool)*25 );
for( int i = 0; i < 25; i++ )
{
while( used[i] == true )
i++;
if( i >= 25 )
break;
used[i] = true;
for( int j = 0; j < 25; j++ )
{
while( used[j] == true )
j++;
if( j >= 25 )
break;
used[j] = true;
for( int k = 0; k < 25; k++ )
{
while( used[k] == true )
k++;
if( k >= 25 )
break;
used[k] = true;
cout << key[i] << key[j] << key[k] << endl;
used[k] = false;
}
used[j] = false;
}
used[i] = false;
}