字符串的排列

题目

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

思路

排列

可分为两步

  1. 求所有可能出现在第一个位置的字符,就是把第一个字符和后面的所有字符交换
  2. 固定第一个字符,求后面所有的字符排列

    1.所有可能出现在 后面第一个字符的字符

    2.这个字符后面的全排列

可以递归求解...

组合

  n个字符串求长度为m组合的时候,可以可以把字符串分为两部分,第一个字符即第一个字符后面的所有字符

  •   如果组合包含第一个字符,则在余下的字符串里求m-1个字符
  •   如果组合不包含第一个字符,则下一步在余下的n-1个子字符里选取m个字符。

  也就是说们可以转化为如下的两个子问题。

  1.   求n-1个字符串中长度为m-1的组合
  2.   求n-1个字符串中长度为m的组合
class Solution {
private:
    void dfs(string &s, int index, vector<string> &res) {
        if (index == s.size()) {
            res.push_back(s);
            return;
        }

        for (int i = index; i < s.size(); ++i) {
            bool falg = false;
            for (int j = index; j < i; ++j) {
                if (s[i] == s[j]) {
                    falg = true;
                }
            }
            if (falg == false) {
                swap(s[i], s[index]);
                dfs(s, index + 1, res);
                swap(s[index], s[i]);
            }            
        }
        return ;
    }
public:
    vector<string> permutation(string s) {
        if (s.empty()) {
            return {};
        }

        vector<string> res;
        int index = 0;
        dfs(s, index, res);
        sort(res.begin(), res.end());
        return res;
    }
};

  关于排列组合算法的详解,也可以参考: https://www.cnblogs.com/tianzeng/p/10055489.html

拓展

  八皇后问题,把八个数字放到正方体的八个顶点上的问题都可以用排列的方法解决

  如果面试时要求按照一定的顺序摆放若干个数字,则先可以求出这些数字的所有排列,然后一一判断每个排列是否满足题目要求。

posted on 2019-01-03 23:01  tianzeng  阅读(261)  评论(0编辑  收藏  举报

导航