剑指 Offer 38. 字符串的排列 - Touale Cula's Blog

题目内容

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

 

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

 

示例:

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

限制:

1
1 <= s 的长度 <= 8

解法一:回溯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
private:
vector<string> res;

void dfs(string &s,int j){
if(j == s.size() - 1) {
res.push_back(s);
return;
}
set<int> st;
for(int i = j;i<s.size();i++){
if(st.find(s[i]) != st.end()) continue; // 重复,因此剪枝
st.insert(s[i]);
swap(s[i],s[j]);
dfs(s,j+1);
swap(s[i],s[j]);
}

}

public:
vector<string> permutation(string s) {
dfs(s,0);
return res;
}
};

结果

1
2
3
4
5
6
7
8
9
10
11
12
执行用时:
44 ms
, 在所有 C++ 提交中击败了
51.33%
的用户
内存消耗:
29.8 MB
, 在所有 C++ 提交中击败了
22.86%
的用户
通过测试用例:
52 / 52