【剑指offer】38、字符串的排列与组合

题目一

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

思路

关键抓住生成全排列的方式,两两交换,递归生成

(二次复位)

abcd  bacd  cbad  dbca

对于abcd:可以固定a,再次从b开始两两交换,abcd  acbd  adcb

以此类推

(单次复位)

abcd bacd cabd dabc

对于abcd:固定a,生成abcd acbd adbd

两种方式生成一样的全排列,只不过输出的顺序一样,单次复位是有字典序的。

代码根据递归实现

class Solution {
public:
    vector<string> Permutation(string str) {
        vector<string> array;
        if(str.size() == 0)
            return array;
        Permutation(array, str, 0);
        sort(array.begin(), array.end()); // 字典序输出
        return array;
    }
     
    void Permutation(vector<string> &array, string str, int begin)// 遍历第begin位的所有可能性
    {
        if(begin == str.size()-1)
            array.push_back(str);
        for(int i = begin; i <= str.size() - 1; i++)
        {
            if(i != begin && str[i] == str[begin])// 有重复字符时,跳过
                continue;
            swap(str[i], str[begin]);
            Permutation(array, str, begin+1); // 遍历其后面的所有字符;
            // swap(str[i], str[begin]);
        }
    }
};

题目二

求字符串所有的组合。

思路

核心思想是不断利用递归实现

class Solution {
public:
    void Combination(char* str){
        vector<char> res;
        length = strlen(str);
        for (int i = 1; i <= length; i++) // 所有组合就是 1组合 2组合 ... n组合
            combination(str, i, res);   
        return;
    }
    
    
    void Combination(char* str, int number, vector<char> &res){
        if (number == 0)
            print;
        if (*string == '\0')
            return;
        res.push_back(*str); // 选了该元素
        Combination(str + 1, number - 1, res);
        res.pop_back();
        Combination(str + 1, number, res);
    }
};

猜你喜欢

转载自www.cnblogs.com/shiganquan/p/9342892.html