剑指offer题目27:字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

解答思路

看了大佬的解析才懂怎么做。。利用递归的思路,首先是把第1个字符和后面的依次交换得到新的字符串,然后到第2个和后面的交换,直到到达终点。

可以使用递归的思路去做,主注意的是题目有两个限制,1个是字符会重复,第二个是需要按照字典序输出

实现代码

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> result;
        Permutation(str, result, 0);

        // 要求按照字典序来输出,所以还是先排一下序
        sort(result.begin(),result.end());
        return result;
    }

    void Permutation(string str, vector<string>& result, int begin) {
        if(begin == str.size() - 1) {
            // 防止aa交换成aa,查找一遍结果集没有才加进去
            if(find(result.begin(), result.end(), str) == result.end()) {
                result.push_back(str);
            }
        } else {
            for (int i = begin; i < str.size(); ++i)
            {
                swap(str[i], str[begin]);               // 交换起始数和后面的数
                Permutation(str, result, begin + 1);    // 继续交换后面的起始和后面的数
                swap(str[i], str[begin]);               // 复位
            }
        }
    }

    void swap(char& a, char& b) {
        char temp = a;
        a = b;
        b = temp;
    }
};

posted @ 2019-04-03 15:31  {-)大傻逼  阅读(156)  评论(0)    收藏  举报
欢迎转载,转载请注明本文地址。