剑指offer38(Java)-字符串的排列(中等)
题目:
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入: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)-字符串的排列(中等)的更多相关文章
- 【剑指offer38】字符串的排列
如果没有要求字典序排序,则直接采用递归的思想,将字符串的排列看成两步,第一步,交换第一个字母和任意一个字母(包括自己,但不包括和自己相等的其他字母)固定第一个字母,固定第一个字母,然后对后面的字符串也 ...
- 剑指 Offer 38. 字符串的排列 + 无重复元素的全排列
剑指 Offer 38. 字符串的排列 Offer_38 题目描述 解题思路 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列. 但是考虑到本题需要排除重复的排列, ...
- 剑指 Offer 38. 字符串的排列
剑指 Offer 38. 字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" ...
- 【剑指Offer】字符串的排列 解题报告(Python)
[剑指Offer]字符串的排列 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- 【Java】 剑指offer(38) 字符串的排列
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串ab ...
- Go语言实现:【剑指offer】字符串的排列
该题目来源于牛客网<剑指offer>专题. 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,b ...
- 《剑指offer》字符串的排列
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 剑指Offer 27. 字符串的排列 (字符串)
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- 剑指offer:字符串的排列
题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...
- 【剑指offer28:字符串的排列】【java】
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. import ja ...
随机推荐
- 摆脱鼠标系列 - vscode 软件 最大化快捷键 - win + ↑
摆脱鼠标系列 - vscode 软件 最大化快捷键 - win + ↑ vscode默认打开不是最大化,所以按 win + 上箭头 使其最大化 不想按 F11 那个不太方便,左上角就没有项目名称了 优 ...
- shell脚本中将 IFS (Internal Field Separator 内部字段分隔符)替换为换行符
将 IFS 中的空白符(换行.制表符.空格)修改为仅包含换行 IFS 是shell中的内部变量,在使用 for var in var_list;do use $var do something don ...
- 专访惠众科技|元宇宙应用如何借助3DCAT实时云渲染实现流畅大并发呈现?
当前互联网流量红利已经逐渐消失,营销同质化愈发严重.在这样的背景下,催生了以元宇宙为焦点的虚拟产业经济.元宇宙在各行各业中以不同形式快速萌生.成长,呈现出多元化的应用场景.尤其是众多品牌,将元宇宙视为 ...
- JS(对象)
一 对象 1.1 对象的相关概念(python中的字典) 什么是对象? 在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串.数值.数 组.函数等. 对象 ...
- window-命令行操作
window命令行操作 调起命令行-win+r输入cmd 网络探活 ping www.baidu.com 快捷启动应用 打开记事本 notepad 打开画图 mspaint 打开计算器 calc 命令 ...
- 上位机连接PLC
上位机使用Hsl框架连接PLC 顺便讲下策略模式 话不多说,直接上代码 public interface IPlcHost { bool ConnectionPlc(string path); } p ...
- 记录--怎么写一个可以鼠标控制旋转的div?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 说在前面 鼠标控制元素旋转在现在也是一个很常见的功能,让我们从实现div元素的旋转控制开始来了解元素旋转的具体原理和实现方法吧. 效果展示 ...
- 工作中总结的30个常用Linux指令,实在记不住就别硬记了,看这篇就够了
写在开头 最近发现自己记忆力严重下滑,很多sql命令,linux命令都记不住,特别是linux命令,很多命令参数很多,一段时间不用,再去使用就需要从网上重查了,很烦人,为此花了一些时间把之前笔记中的L ...
- verilog的文件流和项目流
verilog的文件流和项目流 1.写在前面 在学习FPGA时,一般都是从项目流入手的.从一个集成的开发环境创建一个工程.通过一个个组件的编写和设置来实现某个项目.这样的操作固然简单,对于设计者来说只 ...
- KingbaseES 服务器运行参数分类
Kingbase 服务器运行参数分类 说明: KingbaseES 数据库中,服务器运行参数分为多种类型,有些是系统初始化时设置,有些可以在系统运行时设置,有些可以在运行session中进行直接设置. ...