题目:

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]

限制:

1 <= s 的长度 <= 8

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zi-fu-chuan-de-pai-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

参考:代码随想录视频  和 代码随想录的解释

回溯步骤:回溯法一般是在集合中递归搜索,并抽象为树形结构,集合的大小为数的宽度,递归的深度构成数的深度。

1.回溯函数模板返回值以及参数,函数返回值一般为void。

2.回溯的终止条件;

3.回溯的搜素遍历过程;

思路:

  • 初始化:temp:存放临时组合,result:存放结果,used:是否使用过,初始化为false, 将字符串转换为字符数组,并进行排序(未来后续判断相邻位置字符是否相同)
  • 回溯函数:
    • 当临时数组temp的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点,存放进result;
    • 从头开始循环遍历字符数组
      • 当前后两个字符相同 且 前一个字符已经使用过时,就跳过当前字符,继续for循环
      • 如果当前元素未被使用过,先标记当前元素,然后将当前元素加入temp,再继续回溯下一层直到排列完成,再撤销选择回到未被标记状态。

代码:

 1 class Solution {
2 List<String> result = new ArrayList<>();
3 //暂存结果
4 StringBuffer temp = new StringBuffer();
5 public String[] permutation(String s) {
6 //将字符串转换为字符串数组
7 char[] chars = s.toCharArray();
8 //将字符数组进行排序
9 Arrays.sort(chars);
10 //定义一个boolean数组标记使用过的数组
11 boolean[] used = new boolean[chars.length];
12 //初值全为未被使用
13 Arrays.fill(used, false);
14 //求出排列
15 backtracking(chars, used);
16 //返回结果
17 return result.toArray(new String[result.size()]);
18 }
19 public void backtracking(char[] chars, boolean[] used){
20 //如果暂存的path长度等于字符数组的长度,说明已经找到一个
21 if (temp.length() == chars.length) {
22 result.add(temp.toString());
23 return;
24 }
25 for (int i = 0; i < chars.length; i++){
26 if (i > 0 && chars[i] == chars[i-1] && used[i-1] == false){
27 continue;
28 }
29 if (used[i] == false){
30 used[i] = true;
31 temp.append(chars[i]);
32 //在排列剩下的
33 backtracking(chars, used);
34 //回溯,弹出当前这一个,回到上一步的位置
35 temp.deleteCharAt(temp.length() - 1);
36 //将used回到初始状态
37 used[i] = false;
38 }
39 }
40 }
41 }

小感悟:

第一次遇到回溯,有点难度,还需要多看看才能彻底自己做出来~

剑指offer38(Java)-字符串的排列(中等)的更多相关文章

  1. 【剑指offer38】字符串的排列

    如果没有要求字典序排序,则直接采用递归的思想,将字符串的排列看成两步,第一步,交换第一个字母和任意一个字母(包括自己,但不包括和自己相等的其他字母)固定第一个字母,固定第一个字母,然后对后面的字符串也 ...

  2. 剑指 Offer 38. 字符串的排列 + 无重复元素的全排列

    剑指 Offer 38. 字符串的排列 Offer_38 题目描述 解题思路 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列. 但是考虑到本题需要排除重复的排列, ...

  3. 剑指 Offer 38. 字符串的排列

    剑指 Offer 38. 字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" ...

  4. 【剑指Offer】字符串的排列 解题报告(Python)

    [剑指Offer]字符串的排列 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  5. 【Java】 剑指offer(38) 字符串的排列

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串ab ...

  6. Go语言实现:【剑指offer】字符串的排列

    该题目来源于牛客网<剑指offer>专题. 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,b ...

  7. 《剑指offer》字符串的排列

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  8. 剑指Offer 27. 字符串的排列 (字符串)

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  9. 剑指offer:字符串的排列

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...

  10. 【剑指offer28:字符串的排列】【java】

    题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. import ja ...

随机推荐

  1. whale - awesome 关联单词

    whale - awesome 关联单词 whale 对应 awesome 里面的 awe 两个含义应该是一样的. whale wa哇-惊叹词-大型海洋生物-鲸鱼 来自古英语hwael,大型海洋生物, ...

  2. 异步小工具 asyncTool

    class asyncTool { constructor () { this.arr = [] this.ctx = {} } use (func) { const into = { func, n ...

  3. C++学习笔记之基础语法

    目录 基础语法 switch和if区别 枚举定义及作用域 结构体数据耐齐--缺省对齐原则 函数重载overload与C++Name Mangling 指向函数的指针与返回指针的函数 基础语法 swit ...

  4. Android 8.0 Only fullscreen activities can request orientation解决方法

    原文:Android 8.0 Only fullscreen activities can request orientation解决方法 | Stars-One的杂货小窝 公司的项目坑太多,现在适配 ...

  5. View之invalidate,requestLayout,postInvalidate

    目录介绍 01.invalidate,requestLayout,postInvalidate区别 02.invalidate深入分析 03.postInvalidate深入分析 04.request ...

  6. Scratch基础(一):安装和了解软件

    Scratch基础(一):安装和了解软件 编写计算机程序代码的能力是当今社会读写能力的重要组成部分.当人们学习使用Scratch进行编码时,他们将学习解决问题,设计项目和交流思想的重要策略. 1.安装 ...

  7. Oracle 字符串拆分成一个一个字符

    SELECT (REGEXP_SUBSTR('LW112190', '[A-Z0-9]', 1, ROWNUM)) test FROM DUAL CONNECT BY ROWNUM <= LEN ...

  8. 镭速Raysync v6.6.8.0版本发布

    最近镭速发布了v6.6.8.0版本,已经发布上线了.主要更新内容有服务器下发任务支持指定客户端,客户端增加日志清理和日志压缩,自动删除源文件保持源目录结构,支持将文件投递给其他成员等功能,详细的更新内 ...

  9. KingbaseES V8R6集群运维案例-- 备库数据库服务意外down分析

    案例说明: KingbaseES V8R6一主二备架构的集群,两个备库节点sys_log日志分别不同时间点收到'fast shutdown request'的日志信息,导致备库数据库服务down,需要 ...

  10. #博弈论#HDU 2516 取石子游戏

    题目 \(n\)个石子,两人轮流取.先取者第1次可以取任意多个, 但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍. 取完者胜.先取者负输出"Second win".先取 ...