题目描述

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

输入描述:

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

思路

全排列,因为可能有重复的字符,因此需要将全排列中重复的排列去掉,并按字典序排序。

代码

class Solution {
public:
    void dfs(int k,string s,vector<string> &vec,int len){
        if(k == len){
            vec.push_back(s);
        }
        for(int i = k; i < len; i++){
            swap(s[i],s[k]);
            dfs(k+1,s,vec,len);
            //回溯
            swap(s[i],s[k]);
        }
    }
    vector<string> Permutation(string str) {
        vector<string> vec;
        int len = str.length();
        if(len == 0){
            return vec;
        }
        dfs(0,str,vec,len);
        sort(vec.begin(),vec.end());//排序
        auto it = unique(vec.begin(),vec.end());//删除重复元素
        vec.resize(distance(vec.begin(),it));//重新赋值
        return vec;
    }
};