排列序数
如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
abcd 0
abdc 1
acbd 2
acdb 3
adbc 4
adcb 5
bacd 6
badc 7
bcad 8
bcda 9
bdac 10
bdca 11
cabd 12
cadb 13
cbad 14
cbda 15
cdab 16
cdba 17
…
现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?
输入格式
一行,一个串。
输出格式
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。
输入: bdca
输出: 11
输入: cedab
输出: 70
以前的时候发过解这道题的一种方法:蓝桥杯——排列序数,时隔多日,当我再次回想此题时,又发现了另外一种解法,而且这种解法比上一种思路快,首先呢,题中所求的就是一个全排序的序号,由此可见我们可以借助强大的STL中的next_permutation()函数来解决,详细代码如下所示。和之前一样,我们定义一个字符数组存放a~j,还有一个计数器count,接下来输出一个字符串,先求出字符串的长度,也就是全排序中的条件,如果长度为3,则将a~c进行排序。在排序的过程中,定义一个字符数组用于存放当前的排序,如果当前的排序和输入的字符串一致的话则结束排序,要记住每一次排序都要用计数器加一,最后输出这个计数器即可。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char eng[11]="abcdefghij";
char str[11],temp[11];
int len,count=0,i;
cin >>str;
len=strlen(str);
do{
for(i=0;i<len;i++)
temp[i]=eng[i];
temp[i]='\0';
if(strcmp(temp,str)==0)
break;
count++;
}while(next_permutation(eng,eng+len));
cout <<count;
return 0;
}