解题思路:对于每一个字符串,判断第n-1个位置能不能放,如果不能再去前面找,如果可以,就把从当前位置开始,所有的值都往后加一位。这里我用一个map维护数字与字符之间的映射,方便查找。发现规律:倒数第i位数的值不会超过t+1-i。
#include<bits/stdc++.h>
#define MAX 27
using namespace std;
int s,t,w;
vector<int> arr;//存储字符串对应的位置
map<int,char> mp;//维护数字到字符的映射
int cur_index = 0;//计数
void init()
{
for(int i=1;i<=26;i++)
{
mp[i]=char(i+96);
}
}
bool check()
{
//验证当前的序列是否是最大的序列
int size = arr.size();
int temp;//倒数第temp个
for(int i=size-1;i>=0;i--)
{
temp = size-i;
if(arr[i]<t+1-temp)
{
//不是最大的那一个
//cout<<arr[i]<<endl;
return false;
}
}
return true;
}
void find_next()
{
//找到下一个序列
int size = arr.size();
int temp;//倒数第temp个
for(int i=size-1;i>=0;i--)
{
temp = size-i;
if(arr[i]<t+1-temp)
{
//不是最大的那一个
arr[i]+=1;
//从当前位置开始,往后都比前一个大1
for(int j=i+1;j<size;j++)
{
arr[j]=arr[j-1]+1;
}
break;
}
}
}
void fun()
{
if(cur_index>=1)
{
for(int i=0;i<arr.size();i++)
{
cout<<mp[arr[i]];
}
cout<<"\n";
}
if(check()||cur_index>=5)
{
return;
}
find_next();
cur_index+=1;
fun();
}
int main()
{
cin>>s>>t>>w;
char c;
int temp;
for(int i=0;i<w;i++)
{
cin>>c;
temp = int(c)-int('a')+1;
arr.push_back(temp);
}
init();
fun();
return 0;
}