《剑指offer》-字符串的排列

来源:互联网 发布:策略模式 java的概念 编辑:程序博客网 时间:2024/05/29 03:16

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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;    }};


0 0
原创粉丝点击