或者例如,如果给你“abcd”,词典排列将是:
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba
我直观地理解它是如何排序的,如果你给了我任何一组字母或数字,我可以解决它们应该如何排序,但不是数学上你将如何从一步到达下一个。 例如: 从abdc到acbd的数学过程是什么?
答案 0 :(得分:0)
嗯,一个选项可能是:
从一步走到下一步,
不确定这是最好的方法。为什么要从一步到下一步呢?为什么不写所有的单词,开头写作(n-1)!首字母开头,然后(n -1)!第二次......
a
a
...
a
b
b
...
b
对于这些单词中的每一个:继续(n-2)!第二个字母和(n-2)!第三封信:
ab
ab
...
ab
ac
ac
....
ac
....
ba
ba
...
bc
bc
....
等等
答案 1 :(得分:0)
如果英语是我的母语,我可以向您解释这个问题的各个方面。现在只需给出我的代码(它解释自己)来置换整数:
const int maxn = 2000;
int x[maxn];
void next_permutation(int n)
{
int i;
int min_suffix = INT_MAX;
int min_index = -1;
for(i=n-1; i>0; --i){
if(x[i] < x[i+1])break;
}
if(i==0){
for(int i=1; i<=n; ++i){
x[i] = i;
}
return;
}
for(int j=i+1; j<=n; ++j){
if(x[j]>x[i] && x[j]<min_suffix){
min_suffix = x[j];
min_index = j;
}
}
//swap x[i], x[min_index];
{
int tmp = x[i];
x[i] = x[min_index];
x[min_index] = tmp;
}
//insert_sort x[i+1...n]
{
for(int j=i+2; j<=n; ++j){
int k;
for(k=j-1; k>=i+1; --k){
if(x[j]>x[k])break;
}
int tmp = x[j];
for(int l=j-1; l>k; --l){
x[l+1] = x[l];
}
x[k+1] = tmp;
}
}
}