剑指Offer- 字符串的排列

题目描述 [字符串的排列]

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

输入描述:

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

解题思路

  • 深度优先搜索,当序列中的元素不重复时,存在 n! 种不同的排列;
  • 考虑第一个位置,有 n 种可能
  • 当选定了第一个位置,第二个位置有 n-1 种可能
  • 因为每次搜索的状态数是递减的,所以这里的 dfs 是一个循环递归的过程

代码

class Solution {
public:
    void Permutation(vector &res, string &str, int low, int high) {
        if(low==high) res.push_back(str);

        for(int i=low;i<=high;i++){
            if(i!=low && str[i]==str[low]) continue;
            swap(str[i], str[low]);
            Permutation(res, str, low+1, high);
            swap(str[i], str[low]);
        }
    }

    vector Permutation(string str) {
        vector res;
        if(str.size()==0) return res;
        Permutation(res, str, 0, str.size()-1);
        sort(res.begin(), res.end());
        return res;
    }
};

你可能感兴趣的:(剑指Offer- 字符串的排列)