LeetCode 剑指Offer 38[回溯 递归] 字符串的排列 HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 剑指Offer 38[回溯 递归] 字符串的排列 HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
既然长度允许,那么可以利用回溯的方法遍历所有的排列,当然面对重复的序列有多种解决方法,一个可以用哈希表存储防止重复,还可以通过排序使相同的字符相邻,这样可以通过判断防止重复,后一个方法明显比前一个方法节省时间和空间。遍历所有序列的方式本质是填充,即将所有字符拿出来,对n个空位一个一个进行填充,代码如下:
class Solution {
private:
vector<bool> visited;
vector<string> res;
public:
void backtrack(string s, int i, int len, string& seq) {
// 填充到最后一位
if(i == len) {
res.push_back(seq);
}
for(int j = 0; j < len; j ++) {
// 如果访问过,或者填充重复了
if(visited[j] || (j > 0 && !visited[j - 1] && s[j - 1] == s[j])) {
continue;
}
visited[j] = true;
seq.push_back(s[j]);
backtrack(s, i + 1, len, seq);
// 回溯
visited[j] = false;
seq.pop_back();
}
}
vector<string> permutation(string s) {
int len = s.size();
visited.resize(len);
// 排序一下可以让相同的字符连续,便于避免重复
sort(s.begin(), s.end());
string seq;
backtrack(s, 0, len, seq);
return res;
}
};
以上是关于LeetCode 剑指Offer 38[回溯 递归] 字符串的排列 HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
乱序版 ● 剑指offer每日算法题打卡题解——搜索与回溯算法(题号37,38)