【问题描述】[中等]

输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:
输入: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][字符串的排列][回溯法]相关推荐

  1. 【有返回值的回溯法】剑指offer——面试题66:矩阵中的路径(回溯法)

    剑指offer--面试题66:矩阵中的路径(回溯法) Solution:1 典型的回溯算法及代码 此题是回溯法的典型例题,思路以及代码均是书中所讲.要具体实现很有参考价值,借鉴之! 现在把书中代码贴在 ...

  2. [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]

    [问题描述][中等] [解答思路] 1. 暴力 复杂度分析 class MaxQueue {Queue<Integer> queue = new LinkedList();int maxV ...

  3. [剑指offer]面试题第[47]题[JAVA][礼物的最大价值][动态规划]

    [问题描述][中等] [解答思路] 1动态规划 动态规划流程 第 1 步:设计状态 f(i, j)f(i,j) 为从棋盘左上角走至单元格 (i ,j)(i,j) 的礼物最大累计价值 第 2 步:状态转 ...

  4. [剑指offer]面试题第[60]题[JAVA][n个骰子的点数][动态规划][空间优化]

    [问题描述][中等] 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率.你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集 ...

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

    [问题描述][简单] 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度.例如:给定二叉树 [3,9,20,null,nul ...

  6. [剑指offer]面试题第[1]题[JAVA][二维数组中的查找][数组][二分]

    [问题描述] 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

  7. [剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]

    [问题描述][中等] [解答思路] 中序遍历 时间复杂度:O(N) 空间复杂度:O(N) class Solution {Node pre, head;public Node treeToDoubly ...

  8. [剑指offer]面试题第[44]题[JAVA][数字序列中某一位的数字][找规律]

    [问题描述][中等] [解答思路] 找规律 时间复杂度:O(logN) 空间复杂度:O(logN) class Solution {public int findNthDigit(int n) {in ...

  9. [剑指offer]面试题第[45]题[JAVA][把数组排成最小的数][快排][ Comparator][PriorityQueue]

    [问题描述][中等] [解答思路] 1. 快速排序 时间复杂度:O(N^2) 空间复杂度:O(1) class Solution {public String minNumber(int[] nums ...

最新文章

  1. Linux命令:模拟电信联通双网络智能解析域名
  2. yii required 字段去除*号
  3. allegro16.3 中的orcad capture CIS 无法打开何解决?
  4. php垃圾回收算法分代,PHP的垃圾回收机制代码实例讲解
  5. c语言如何答应出数所在数组的下标_零基础学C语言——数组
  6. docker 启动tomcat_docker安装tomcat
  7. Halcon 抓圆工具spoke
  8. [九度][何海涛] 数组中只出现一次的数字
  9. Spring消息之STOMP
  10. 理解SNS系列之二:更进一步,近观SNS
  11. 面试(软件实施工程师)
  12. 前端事件练习之轮播图代码
  13. Hive操作——复制表结构和数据
  14. oracle job remove,如何删除oracle Job命令实例
  15. 百度引流软文怎么写?如何利用软文从百度引流?
  16. 计算机软件实习每日学习打卡(5)20201218
  17. 安卓游戏《罗马帝国》游戏心得
  18. 3dmax:3dmax中的快捷键集合大全(分门别类,建议收藏)
  19. Windows Internet Information Services(IIS) 与 inetpub 文件夹
  20. 人脸识别、二维码电子签到,让会议会展入场更加智能!

热门文章

  1. 【转】String.format详解
  2. Hello Indigo
  3. 【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁
  4. CWnd与HWND的区别与转换
  5. linux 2行数据为一条记录 该如何操作这一条记录_Linux 日志文件系统原来是这样工作的...
  6. Visual.Assist.X.V10.7.1940的汉化破解补丁
  7. ssh报错解决 ECDSA host key for 123.56.11.181 has changed and you have requested strict checking.
  8. java solr_通过Java访问Solr服务实例及相关配置
  9. postgresql查询mysql库_postgresql 查看数据库,表,索引,表空间以及大小
  10. git clone远程仓库时,输错密码如何解决?