[剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]

【问题描述】[中等]

输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]限制:
1 <= s 的长度 <= 8

【解答思路】

回溯法

在这里插入图片描述
时间复杂度:O(N!) 空间复杂度:O(N^2)
在这里插入图片描述

class Solution {List<String> res = new LinkedList<>();char[] c;public String[] permutation(String s) {c = s.toCharArray();dfs(0);return res.toArray(new String[res.size()]);}void dfs(int x) {if(x == c.length - 1) {res.add(String.valueOf(c)); // 添加排列方案return;}HashSet<Character> set = new HashSet<>();for(int i = x; i < c.length; i++) {if(set.contains(c[i])) continue; // 重复,因此剪枝set.add(c[i]);swap(i, x); // 交换,将 c[i] 固定在第 x 位 dfs(x + 1); // 开启固定第 x + 1 位字符swap(i, x); // 恢复交换}}void swap(int a, int b) {char tmp = c[a];c[a] = c[b];c[b] = tmp;}
}
2.

时间复杂度:O(N) 空间复杂度:O(1)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Solution {public String[] permutation(String s) {int len = s.length();if (len == 0) {return new String[0];}// 转换成字符数组是常见的做法char[] charArr = s.toCharArray();// 排序是为了去重方便Arrays.sort(charArr);// 由于操作的都是字符,使用 StringBuilderStringBuilder path = new StringBuilder();boolean[] used = new boolean[len];// 为了方便收集结果,使用动态数组List<String> res = new ArrayList<>();dfs(charArr, len, 0, used, path, res);// 记得转成字符串数组return res.toArray(new String[0]);}/*** @param charArr 字符数组* @param len     字符数组的长度* @param depth   当前递归深度* @param used    当前字符是否使用* @param path    从根结点到叶子结点的路径* @param res     保存结果集的变量*/private void dfs(char[] charArr,int len,int depth,boolean[] used,StringBuilder path,List<String> res) {if (depth == len) {// path.toString() 恰好生成了新的字符对象res.add(path.toString());return;}for (int i = 0; i < len; i++) {if (!used[i]) {if (i > 0 && charArr[i] == charArr[i - 1] && !used[i - 1]) {continue;}used[i] = true;path.append(charArr[i]);dfs(charArr, len, depth + 1, used, path, res);// 递归完成以后,需要撤销选择,递归方法执行之前做了什么,递归方法执行以后就需要做相应的逆向操作path.deleteCharAt(path.length() - 1);used[i] = false;}}}public static void main(String[] args) {Solution solution = new Solution();String[] res = solution.permutation("aba");System.out.println(Arrays.toString(res));}
}

【总结】

1.回溯法 剪枝+恢复状态
2.collection.toArray(new String[0])中new String[0]的语法解释(指定泛型)

在这里插入图片描述

3. 写法二会比写法一 好理解

转载链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/mian-shi-ti-38-zi-fu-chuan-de-pai-lie-hui-su-fa-by/
参考链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/hui-su-suan-fa-java-by-liweiwei1419/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

32tomcat的目录结构

<% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>歌谣</title> </head> <bod…

[剑指offer]面试题第[52]题[Leedcode][第160题][JAVA][相交链表][双指针]

【问题描述】[简单] 【解答思路】 1. 双指针法 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA null || headB null) return null;ListNode pA headA, pB headB;while (pA !…

33tomcat目录结构

1创建一个myhome文件 2创建一个index.jsp文件 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><!DOCTYPE html><html><head><meta charset"utf-8"><title>歌…

复合数据类型,英文词频统计

作业要求&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2696 1.列表&#xff0c;元组&#xff0c;字典&#xff0c;集合分别如何增删改查及遍历。 列表的增删改查list1 list(this is a list)#增加list1.append(!) #末尾增加元素list1.insert(2,this i…

34tomcat设置默认页面

如何让hah.jsp成为欢迎界面&#xff1f; 在web-inf文件夹中配置项目部署文件web.xml。 添加标签 <welcome-file-list> <welcome-file>/hah.jsp</welcome-file> <welcome-file-list> 改变web.xml文件首页&#xff0c;报 将文件变成hah.jsp 默认页就设置…

[Leetcode][第718题][JAVA][最长重复子数组][动态规划][滑动窗口][暴力]

【问题描述】[中等] 给两个整数数组 A 和 B &#xff0c;返回两个数组中公共的、长度最长的子数组的长度。示例 1:输入: A: [1,2,3,2,1] B: [3,2,1,4,7] 输出: 3 解释: 长度最长的公共子数组是 [3, 2, 1]。 说明:1 < len(A), len(B) < 1000 0 < A[i], B[i] < 100…

[剑指offer]面试题第[53-1]题[JAVA][在排序数组中查找数字-1][二分法][暴力法]

【问题描述】[中等] 统计一个数字在排序数组中出现的次数。 示例 1:输入: nums [5,7,7,8,8,10], target 8 输出: 2 示例 2:输入: nums [5,7,7,8,8,10], target 6 输出: 0【解答思路】 1. 暴力法/遍历 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) public int…

[剑指offer]面试题第[53-2]题[JAVA][0-n-1中缺失的数字][二分法][暴力法]

【问题描述】[简单] 一个长度为n-1的递增排序数组中的所有数字都是唯一的&#xff0c;并且每个数字都在范围0&#xff5e;n-1之内。在范围0&#xff5e;n-1内的n个数字中有且只有一个数字不在该数组中&#xff0c;请找出这个数字。示例 1:输入: [0,1,3] 输出: 2 示例 2:输入: …

过拟合问题详解

具体内容来自于读芯术&#xff1a;https://mp.weixin.qq.com/s?__bizMzI2NjkyNDQ3Mw&mid2247487002&idx1&sn05d13bd67a31e38434285c5f0262b95d&chksmea87f6ccddf07fdae17a71819ba0577d099bb49b291093e7c6c7927456febfb3d8d308c30ad6&scene21#wechat_redir…

[Leetcode][第378题][JAVA][有序矩阵中第K小的元素][二分法][归并排序][暴力]

【问题描述】[中等] 给定一个 n x n 矩阵&#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是排序后的第 k 小元素&#xff0c;而不是第 k 个不同的元素。示例&#xff1a; matrix [[ 1, 5, 9],[10, 11, 13],[12, 13…

设计模式-Builder和Factory模式区别

Builder和Factory模式区别 Builder模式结构&#xff1a; Factory模式一进一出,Builder模式是分步流水线作业。当你需要做一系列有序的工作或者按照一定的逻辑来完成创建一个对象时 Builder就派上用场啦。我们可以看到&#xff0c;Builer模式与工厂模式是极为相似的&#xff0c;…

[剑指offer]面试题第[54]题[JAVA][二叉搜索树的第k大节点][递归][迭代]

【问题描述】[简单] 给定一棵二叉搜索树&#xff0c;请找出其中第k大的节点。示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4 示例 2:输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出: 4【解答思路】 反向中序遍历 遍历到第k个节点时&…

[Leetcode][第108题][JAVA][将有序数组转换为二叉搜索树][二分法][递归]

【问题描述】[简单] 将一个按照升序排列的有序数组&#xff0c;转换为一棵高度平衡二叉搜索树。本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是&#xff1a;[0,-3…

数据结构:(1)课程总览

“数据结构”课程的内容 “数据结构”在计算机课程体系&#xff08;偏软&#xff09;中的地位 “数据结构”与程序设计类课程的关系 “数据结构”的学习目标 “数据结构”的学习方法

[剑指offer]面试题第[55-1]题[JAVA][二叉树的深度][BFS][DFS]

【问题描述】[简单] 输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。例如&#xff1a;给定二叉树 [3,9,20,null,null,15,7]&#xff0c;3/ \9 …

[剑指offer]面试题第[55-2]题[Leetcode][第110题][JAVA][平衡二叉树][DFS][剪枝]

【问题描述】[中等] 输入一棵二叉树的根节点&#xff0c;判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1&#xff0c;那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7]3/ \9 20/ \15 7 返回 true 。示例 2:给定二叉树…