1. 首页
  2. 剑指offer经典面试题

[剑指 Offer 第 2 版第 38 题] “字符串的排列”做题记录

[剑指 Offer 第 2 版第 38 题] “字符串的排列”做题记录

第 38 题:字符串的排列(重要,回溯)

传送门:数字排列牛客网 online judge 地址

输入一组数字(可能包含重复数字),输出其所有的排列方式。

样例:

输入:[1,2,3]

输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

分析:八皇后问题根据排列组合来求解,关键是判定不符合要求的解。回溯:时间复杂度是 O(n!)

题目描述:跟 LeetCode 47. Permutations II 一模一样,都是不重复的全排列。注意区分上一道题 LeetCode 46. Permutations 。

Python 代码:学会使用位运算判重

  class Solution:
        def permutation(self, nums):
            """
            :type nums: List[int]
            :rtype: List[List[int]]
            """

            l = len(nums)
            res = []
            if l == 0:
                return res
            # 因为含有重复数组,所以先排序
            nums.sort()
            path = [0 for _ in range(l)]
            self.__dfs(nums, 0, 0, path, 0, res)

            return res

        def __dfs(self, nums, index, start, path, state, res):
            if index == len(nums):
                res.append(path[:])
                return

            if index == 0 or nums[index] != nums[index - 1]:
                start = 0

            for i in range(start, len(nums)):
                if (state >> i & 1) == 0:
                    path[i] = nums[index]
                    self.__dfs(nums, index + 1, i + 1, path, state + (1 << i), res)

Java 代码:

  import java.util.ArrayList;
    import java.util.Stack;

    class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;

        }
    }

    public class Solution {
        // 使用搜索的策略可以完成
        public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
            ArrayList<ArrayList<Integer>> res = new ArrayList<>();
            Stack<Integer> pre = new Stack<>();
            findPath(root, target, pre, res);
            return res;
        }

        private void findPath(TreeNode root, int target, Stack<Integer> pre, ArrayList<ArrayList<Integer>> res) {
            if (root == null || root.val > target) {
                return;
            }
            // 注意:题目中问的是到叶子结点
            if (root.val == target && root.left == null && root.right == null) {
                pre.add(root.val);
                res.add(new ArrayList<>(pre));
                pre.pop();
                return;
            }
            assert root.val < target && root != null;
            pre.add(root.val);
            findPath(root.left, target - root.val, pre, res);
            findPath(root.right, target - root.val, pre, res);
            pre.pop();
        }

        public static void main(String[] args) {
            TreeNode node1 = new TreeNode(1);
            TreeNode node2 = new TreeNode(2);
            TreeNode node3 = new TreeNode(3);
            TreeNode node4 = new TreeNode(4);
            TreeNode node8 = new TreeNode(8);
            TreeNode node7 = new TreeNode(7);

            node1.left = node2;
            node1.right = node3;

            node2.left = node4;
            node2.right = node8;

            node3.left = node7;

            Solution solution = new Solution();
            ArrayList<ArrayList<Integer>> findPath = solution.FindPath(node1, 11);
            System.out.println(findPath);
        }
    }

作者:liweiwei1419

来源:https://liweiwei1419.github.io/sword-for-offer/


看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:[剑指 Offer 第 2 版第 38 题] “字符串的排列”做题记录

    链接:https://www.javajike.com/article/3285.html

« [剑指 Offer 第 2 版第 37 题] “序列化二叉树”做题记录
[剑指 Offer 第 2 版第 39 题] “数组中出现次数超过一半的数字”做题记录»

相关推荐

QR code