按字典顺序排序
主要思路
举个生动形象的例子,大小关系满足如此的一个序列:(小 < 大 > 中),将其作为初始状态。
1.从一个初始序列中,从后往前查找,找第一个满足a[i-1]<a[i]
的元素,将i-1记下来,即为小。也可以看出大之后的元素是由大到小的,是一个最大值的序列。
2.那么再从后往前查找,找第一个大于a[i-1]
的值,记住下标为k,即为中。
3.将i-1的值与k的值交换,此时 (中 大 小),而大之后的元素依然保持从大到小。
4.接着逆序i-1后面的所有值,刚好得出初始序列的下一个序列,(中 小 大)。
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> a;
if(str.size()==0) return a;
a.push_back(str);
int i;
int length=str.size()-1;
if(length==0) return a;
i=length;
while(i>0){
if(str[i-1]<str[i]){
int j=i-1;
int k;
for(k=length;k>=i;k--)
{
if(str[k]>str[j])
break;
}
char t;
t=str[k];
str[k]=str[j];
str[j]=t;
fanzhuan(str,j+1);
a.push_back(str);
i=length;
}
else --i;
}
return a;
}
void fanzhuan(string &str,int i)
{
int j=str.size()-1;
for(i,j;i<j;i++,j--)
{
char t;
t=str[i];
str[i]=str[j];
str[j]=t;
}
}
};