【LeetCode】剑指 Offer(20)

简介: 【LeetCode】剑指 Offer(20)

题目:剑指 Offer 38. 字符串的排列 - 力扣(Leetcode)


题目的接口:

class Solution {
public:
    vector permutation(string s) {
    }
};

解题思路:

知道题用到的是回溯的思想,


但是我之前没有做过回溯的题目,


所以可能在理解上有一点不太到位,请见谅:


我的思路是使用一个string来模拟每种情况,然后push进一个数组;


建一个类型是bool的数组用来判断字符串中的字符使用情况(哪个用了,哪个没用);


为了更好的剪枝(删除重复情况),用排序将将相同的字母连在一起,


开始回溯:


如果情况成立,就push进数组;


通过循环遍历(以每个字符开始,有不同情况)


如果出现:同一层两个字符相等,且上一个字符用之前过,证明重复了(剪枝)


最后回溯完返回即可。


代码:

class Solution {
public:
    //这是要返回的数组
    vector res;
    vector permutation(string s) {
        //判断字符串为空的情况
        if(s.size() == 0)   
        {
            return {};
        }
        //建一个string用来接收每种情况
        string tmp;
        //用这个数组来判断该位置有无字符(并初识化)
        vector used(s.size());
        //排序,将相同的字母连在一起
        sort(s.begin(), s.end());
        //回溯
        backtrack(s, tmp, used);
        //返回
        return res;
    }
private:
    void backtrack(string s, string& tmp, vector& used)
    {
        //一种情况成立,push进res
        if(s.size() == tmp.size())
        {
            res.push_back(tmp);
            return;
        }
        //循环遍历每一个位置的每一种情况
        for(int i = 0; i < s.size(); i++)
        {
            //如果该位置有字符了,就不进去,让i继续++
            if(!used[i])
            {
                //如果字符串s出现同一层两个字符相等,且上一个字符用之前过,证明重复了
                if(i >= 1 && s[i - 1] == s[i] && !used[i - 1])
                {
                    continue;
                }
                //插入
                tmp.push_back(s[i]);
                //表示这个位置已经有字符了
                used[i] = true;
                //继续回溯
                backtrack(s, tmp, used);
                //返回上一层
                tmp.pop_back();
                //表示这个位置没有字符了(这样就能继续往tmp里面插入字符)
                used[i] = false;
            }
        }
    }
};

有很多题目思路很复杂,不可能只靠写一道题目就学会,


需要多去刷一些同类型的题目,才能更好的学习。


过啦!!!


写在最后:

以上就是本篇文章的内容了,感谢你的阅读。


如果喜欢本文的话,欢迎点赞和评论,写下你的见解。


如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。


之后我还会输出更多高质量内容,欢迎收看。


相关文章
|
29天前
|
存储
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
24 1
|
1月前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
1月前
|
算法 定位技术
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
24 0
|
1月前
|
Go
golang力扣leetcode 剑指Offer II 114. 外星文字典
golang力扣leetcode 剑指Offer II 114. 外星文字典
30 0
|
1月前
「LeetCode」剑指 Offer 40. 最小的k个数
「LeetCode」剑指 Offer 40. 最小的k个数
34 0
|
1月前
leetcode 剑指 Offer 32 - III. 从上到下打印二叉树 III
leetcode 剑指 Offer 32 - III. 从上到下打印二叉树 III
27 0
|
1月前
leetcode 剑指 Offer 32 - II. 从上到下打印二叉树 II
leetcode 剑指 Offer 32 - II. 从上到下打印二叉树 II
30 0
|
1月前
/leetcode 剑指 Offer 32 - I. 从上到下打印二叉树
/leetcode 剑指 Offer 32 - I. 从上到下打印二叉树
25 0
|
1月前
leetcode 剑指 Offer 40. 最小的k个数
leetcode 剑指 Offer 40. 最小的k个数
23 0
|
1月前
LeetCode 剑指 Offer 28. 对称的二叉树
LeetCode 剑指 Offer 28. 对称的二叉树
21 0