题目描述

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

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

解题思路

图片说明

class Solution {
public:
    //回溯法
    vector<string> Permutation(string str) {
        vector<string> result;
        //空字符串直接返回result
        if(str.size()==0)
            return result;

        //用一个集合进行存储,避免重复,同时默认排好序了
        set<string> res;
        Permutation(str,res,0);
        //将集合中的元素依次加入result
        for(auto &e:res)
            result.push_back(e);
        return result;
    }

    void Permutation(string str, set<string>& res, int begin)
    {
        //递归结束条件:索引已经指向str最后一个元素时
        if(begin==str.size()-1)
            res.insert(str);
        else
        {
            for(int i=begin;i<str.size();i++)
            {
                //依次进行交换
                swap(str[begin],str[i]);
                Permutation(str,res,begin+1);
                //复位
                swap(str[begin],str[i]);
            }
        }
    }

    //交换两个字符
    void swap(char& first,char& second)
    {
        char t = first;
        first = second;
        second = t;
    }
};