题目描述
字典序也称字母顺序或词典序,是按字母顺序排列的单词的方法。
最常见的,英文词典中的词条顺序就是字典序:按字母表中的顺序先排第一个字母,然后再排第二个字母,依次类推,直到所有词汇都有确定的顺序。
类似地,所有的十进制三位数,按照每个数字从小到大的顺序排成字典序,正好就是三位数从小到大的顺序。
再比如给定字母表的顺序为“计<算<机”,所有由三个字排列得到的串按字典序就是:
计算机,计机算,算计机,算机计,机计算,机算计。
现给定n个按照某种“从小到大”的顺序排列的字符,把这n个字符排列得到的串排成字典序,输出字典序序列中的第k个串(n<100)。
输入的字符中只有英文、数字和英文符号,不包括汉字。
本人菜鸡一个大佬轻喷,有什么不对的地方请大佬批评指正
样例
样例1:
输入:ABC 4
输出:BCA
说明:ABC的全排列排列成字典序序列是:ABC,ACB,BAC,BCA,CAB,CBA。其中第4个是BCA。
样例2:
输入:XBM 4
输出:BMX
说明:输入串为3个字符:X<B<M。按照该顺序,把各种全排列排成字典序序列是:XBM,XMB,BXM,BMX,MXB,MBX。其中第4个是BMX。
样例3:
输入:54321 20
输出:51423
说明:输入串为5个字符:5<4<3<2<1。按照该顺序,把各种全排列排成字典序序列,第20个是“51423”。
C++ 代码 dfs 全排列拓展
#include<iostream>
using namespace std;
const int N=20;
bool path[N];
char a[N],s[N];
int n,t;
void dfs(int u)// u控制新的排列,i控制原数列的第i个数
{
if(u>=n)
{
if(!t)
{
for(int i=0;i<n;i++)
cout<<s[i];
cout<<endl;
}
t--;
}
else
{
for(int i=0;i<n;i++)
{
if(!path[i])
{
path[i]=true;
s[u]=a[i];
dfs(u+1);
path[i]=false;
}
}
}
}
int main()
{
string str;
cin>>str>>t;//cin>>a+1 不知道为什么会有问题
--t;
n=str.size();
for(int i=0;i<str.size();i++) a[i]=str[i];
dfs(0);
return 0;
}