面试题38:字符串的排列

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

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

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> res;
        helpFunc(res,0,str);
        return res;
    }

    void helpFunc(vector<string>& res,int k, string str)
    {
        if(k == str.size() - 1)
            res.push_back(str);
        unordered_set<char> us; //记录出现过的字符并去重
        sort(str.begin()+k, str.end());//字典序排序
        for(int i = k; i < str.size(); ++i)
        {
            if(us.find(str[i]) ==  us.end())//只和未交换过的换
            {
                us.insert(str[i]);
                swap(str[i],str[k]);
                helpFunc(res, k+1, str);
                swap(str[i],str[k]);//复位
            }
        }
    }
};

你可能感兴趣的:(剑指Offer)