[剑指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/
[剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]相关推荐
- 【有返回值的回溯法】剑指offer——面试题66:矩阵中的路径(回溯法)
剑指offer--面试题66:矩阵中的路径(回溯法) Solution:1 典型的回溯算法及代码 此题是回溯法的典型例题,思路以及代码均是书中所讲.要具体实现很有参考价值,借鉴之! 现在把书中代码贴在 ...
- [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]
[问题描述][中等] [解答思路] 1. 暴力 复杂度分析 class MaxQueue {Queue<Integer> queue = new LinkedList();int maxV ...
- [剑指offer]面试题第[47]题[JAVA][礼物的最大价值][动态规划]
[问题描述][中等] [解答思路] 1动态规划 动态规划流程 第 1 步:设计状态 f(i, j)f(i,j) 为从棋盘左上角走至单元格 (i ,j)(i,j) 的礼物最大累计价值 第 2 步:状态转 ...
- [剑指offer]面试题第[60]题[JAVA][n个骰子的点数][动态规划][空间优化]
[问题描述][中等] 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率.你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集 ...
- [剑指offer]面试题第[55-1]题[JAVA][二叉树的深度][BFS][DFS]
[问题描述][简单] 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度.例如:给定二叉树 [3,9,20,null,nul ...
- [剑指offer]面试题第[1]题[JAVA][二维数组中的查找][数组][二分]
[问题描述] 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...
- [剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]
[问题描述][中等] [解答思路] 中序遍历 时间复杂度:O(N) 空间复杂度:O(N) class Solution {Node pre, head;public Node treeToDoubly ...
- [剑指offer]面试题第[44]题[JAVA][数字序列中某一位的数字][找规律]
[问题描述][中等] [解答思路] 找规律 时间复杂度:O(logN) 空间复杂度:O(logN) class Solution {public int findNthDigit(int n) {in ...
- [剑指offer]面试题第[45]题[JAVA][把数组排成最小的数][快排][ Comparator][PriorityQueue]
[问题描述][中等] [解答思路] 1. 快速排序 时间复杂度:O(N^2) 空间复杂度:O(1) class Solution {public String minNumber(int[] nums ...
最新文章
- Linux命令:模拟电信联通双网络智能解析域名
- yii required 字段去除*号
- allegro16.3 中的orcad capture CIS 无法打开何解决?
- php垃圾回收算法分代,PHP的垃圾回收机制代码实例讲解
- c语言如何答应出数所在数组的下标_零基础学C语言——数组
- docker 启动tomcat_docker安装tomcat
- Halcon 抓圆工具spoke
- [九度][何海涛] 数组中只出现一次的数字
- Spring消息之STOMP
- 理解SNS系列之二:更进一步,近观SNS
- 面试(软件实施工程师)
- 前端事件练习之轮播图代码
- Hive操作——复制表结构和数据
- oracle job remove,如何删除oracle Job命令实例
- 百度引流软文怎么写?如何利用软文从百度引流?
- 计算机软件实习每日学习打卡(5)20201218
- 安卓游戏《罗马帝国》游戏心得
- 3dmax:3dmax中的快捷键集合大全(分门别类,建议收藏)
- Windows Internet Information Services(IIS) 与 inetpub 文件夹
- 人脸识别、二维码电子签到,让会议会展入场更加智能!
热门文章
- 【转】String.format详解
- Hello Indigo
- 【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁
- CWnd与HWND的区别与转换
- linux 2行数据为一条记录 该如何操作这一条记录_Linux 日志文件系统原来是这样工作的...
- Visual.Assist.X.V10.7.1940的汉化破解补丁
- ssh报错解决 ECDSA host key for 123.56.11.181 has changed and you have requested strict checking.
- java solr_通过Java访问Solr服务实例及相关配置
- postgresql查询mysql库_postgresql 查看数据库,表,索引,表空间以及大小
- git clone远程仓库时,输错密码如何解决?