剑指 Offer 38 | 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
- 限制:
1 <= s 的长度 <= 8
思路:大问题分解为小问题,字符串的长度为len,固定当前字符,则当前字符固定时,字符串的全排列为剩下的len-1个字符的全排列(可以想象一下密码箱,固定一个密码,剩下的有多少种排列)。一直递归下去,遇到最后一个字符,保存当前字符串。因为字符会重复,所以要做一个判断,如果当前位置已经固定过该字符,就不重复固定。
void helper(vector<string>&res, string str, int index) {
if (index == str.size() - 1) {
res.push_back(str);
}
set<char> record;
for (int i = index; i < str.size(); i++) {
if (record.count(str[i])) // 该字符在当前位置已经固定过
continue;
record.insert(str[i]);
swap(str[i], str[index]);
helper(res, str, index + 1);
swap(str[i], str[index]);
}
}
vector<string> permutation(string s) {
vector<string> res;
helper(res, s, 0);
return res;
}
标签:index,38,Offer,res,排列,str,字符,字符串
From: https://www.cnblogs.com/AngleLin/p/16995820.html