剑指Offer(牛客版)--面试题38:字符串的排列

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

分析:

第一步:把第一个字符和后面的所有字符交换;

第二步:固定一个字符,求后面的字符的排列;

完整代码:

class Solution {
public:
    vector<string> Permutation(string str) {
        //声明一个容器用
        vector <string> array;
        //检查输入的合法性
        if(str.length() <= 0)
            return array;
        Permutation(str, array, 0);
        //此时得到的array中排列并不是字典排序,可以单独再排下序
        sort(array.begin(), array.end());
        return array;
    }
private:
    void Permutation(string str, vector<string>&array, int pBegin)
    {
        //递归结束的条件:索引已经指向str最后一个元素
        if(pBegin == str.size() - 1)
            array.push_back(str);
        else
        {
            for(int i = pBegin; i <= str.size() - 1; i++)
            {
                //有重复的字符时,跳过
                if(i != pBegin && str[i] == str[pBegin])
                    continue;
                //当 i= pBegin时,也要遍历其后面的所有字符
                //当 i!= pBegin时,先交换,使第pBegin位渠道不同的字符,再遍历后面的字符
                swap(str[i], str[pBegin]);
                //遍历其后面的字符
                Permutation(str, array, pBegin + 1);
            }
        }
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41923658/article/details/93341362