这是一道经典题目。
递归方法暂时还不太理解,这里给出常规思路。
对于“12345”,其全排列的第一个是“12345”,最后一个是“54321”。
对于“35421”,其下一个的求法是:
首先从后向前找到“下降”的位置i,3<5421,即i=0,接着从后向前找到比第i位置大的数的位置j,即j=2,交换ij,得到“45321”。
最后把i位置后面的字符逆序,得到“41235”。
代码如下:
vector<string> Permutation(string str) {
vector<string> strs;
int len = str.size();
if (len == 0)
return strs;
sort(str.begin(), str.end());
string strEnd = str;
for (int i = 0; i < len/2; i++){
char t = strEnd[i];
strEnd[i] = strEnd[len-1-i];
strEnd[len-1-i] = t;
}
strs.push_back(str);
while (strEnd.compare(str) != 0){
int i;
for (i = len-1; i > 0; i--){
if (str[i] > str[i-1])
break;
}
int j;
for (j = len-1; j > i-1; j--){
if (str[j] > str[i-1])
break;
}
swap(str, i-1, j);
reverse(str, i, len);
strs.push_back(str);
}
//strs.push_back(strEnd);
return strs;
}
void swap(string & str, int i, int j){
char t = str[i];
str[i] = str[j];
str[j] = t;
}
void reverse(string & str, int s, int e){
for (int i = s; i < (s+e)/2; i++){
char t = str[i];
str[i] = str[s+e-i-1];
str[s+e-i-1] = t;
}
}