字符串的排列(剑指Offer-38)

题面

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例

1输入:s = "abc"
2输出:["abc","acb","bac","bca","cab","cba"]

限制

11 <= s 的长度 <= 8

思路

dfs遍历回溯。

代码

 1class Solution {
 2    vector<string> ans;
 3    void dfs(string s, string &t, vector<bool> &vis){
 4        if(s.size() == t.size()){
 5            ans.push_back(t);
 6            return;
 7        }
 8        for(int i=0; i<s.size(); i++){
 9            if(vis[i]) continue;
10            if(i && s[i-1]==s[i] && !vis[i-1]) continue;
11            t.push_back(s[i]);
12            vis[i] = true;
13            dfs(s, t, vis);
14            vis[i] = false;
15            t.pop_back();
16        }
17    }
18public:
19    vector<string> permutation(string s) {
20        if(s.size() == 0) return {};
21        string t = "";
22        sort(s.begin(), s.end());
23        vector<bool> vis(s.size());
24        dfs(s, t, vis);
25        return ans;
26    }
27};