题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解法:可以使用STL里面的全排序的函数,next_permutatio()。这里我对函数内部进行了一下研究,参考的STL源码里面的代码理解了一遍,大牛写的代码就是厉害。细细体会。那个剑指书上的递归代码把我搞得晕头转向的,进行了单步调试,脑子不够用,溢出了(不过用来训练程序思维到倒是挺好的,改天再推演推演)。。。。。还是大牛STL里面的更加好理解吧。
template <class T>
bool my_next_permutation(T first, T last) {
if(first == last) return false;
T i = first;
++i;
if(i == last) return false; //只有一个元素
i = last;
--i; //指向最后一个元素
for(;;) {
T ii = i; //最后一个元素
--i; //倒数第二个元素
if(*i < *ii) { //找到两者相邻,且前者小于后者的一对邻居
T j = last; //从最后一个开始找
while(!(*i < *--j)); //找到第一个大于i的元素
iter_swap(i, j); //应该是指向的值互换
reverse(ii, last);
return true;
}
if(i == first) {
reverse(first, last);
return false;
}
}
}
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
if(str.length() == 0) return result;
result.push_back(str);
while (my_next_permutation(str.begin(), str.end()))
{
result.push_back(str);
}
return result;
}
};