LeetCode-剑指 Offer 38. 字符串的排列

LeetCode-剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

解题方法:
回溯+剪枝思想
回溯解题步骤:
1、画递归树,找出状态变量(参数)
2、确定结束条件
3、找选择列表
4、判断是否需要剪枝
5、做出选择、递归调用,进入下一层
6、 撤销选择

class Solution {
    vector<string> ans;
    void dfs(string &s,string &path,vector<bool>used)
    {
        if(path.size()==s.size())   //确定结束条件
        {
            ans.push_back(path);
            return;
        }
        for(int i=0;i<s.size();i++)  //明确选择列表
        {
            if(used[i]==false)    //标志变量
            {
                if(i>=1&&s[i-1]==s[i]&&used[i-1]==false)  //剪枝条件
                continue;
                //做出选择、递归调用,进入下一层
                path.push_back(s[i]);
                  used[i]=true;
                  dfs(s,path,used);
                  used[i]=false;
                  path.pop_back();   // 撤销选择
            }             
        }
    }

public:
    vector<string> permutation(string s) {
        string tmp="";
        vector<bool> used(s.size(),0);   
       sort(s.begin(),s.end());  //由于可能出现重复元素,所以先排序,在用剪枝条件去重
        dfs(s,tmp,used);
        return ans;
    }
};

你可能感兴趣的:(剑指offer,剪枝,字符串,leetcode)