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 38. 字符串的排列

Leetcode之深度遍历递归与回溯法汇总

乱序版 ● 剑指offer每日算法题打卡题解——搜索与回溯算法(题号37,38)

剑指 Offer 38. 字符串的排列-全排列-回溯

剑指 Offer 38. 字符串的排列(dfs回溯实现全排列,Java)

剑指 Offer 24. 反转链表(双指针+递归)