首页 > 编程语言 >剑指offer38(Java)-字符串的排列(中等)

剑指offer38(Java)-字符串的排列(中等)

时间:2023-04-10 20:55:56浏览次数:44  
标签:offer38 字符 used Java temp chars 数组 回溯 字符串

题目:

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

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

 

示例:

输入: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,字符,used,Java,temp,chars,数组,回溯,字符串
From: https://www.cnblogs.com/liu-myu/p/17302473.html

相关文章

  • Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例
    场景Java中创建线程的方式有三种1、通过继承Thread类来创建线程定义一个线程类使其继承Thread类,并重写其中的run方法,run方法内部就是线程要完成的任务,因此run方法也被称为执行体,使用start方法来启动线程。2、通过实现Runanle接口来创建线程首先定义Runnable接口,并重写Runnab......
  • java11_Object类
    Object类相关JavaObject类是所有类的父类,也就是说Java的所有类都继承了Object,子类可以使用Object的所有方法。Object类位于java.lang包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承Object,成为Object的子类。内部结构:类的......
  • java 日志框架总结
    日志级别ALL<TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFFALL:最低等级的,用于打开所有日志记录。TRACE:designatesfiner-grainedinformationaleventsthantheDEBUG.Since:1.2.12,很低的日志级别,一般不会使用。DEBUG:指出细粒度信息事件对调试应用程序是非常有帮......
  • Java匿名对象
    Java匿名对象创建对象的标准格式匿名对象的介绍Phone类importorg.w3c.dom.ls.LSOutput;publicclassPhone{//定义成员变量Stringbrand;publicvoidShowBrand(){System.out.println("手机的品牌是:"+brand);}}main函数public......
  • 【享元设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介享元模式(FlyweightPattern),是一种结构型设计模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。当程序需要生成数量巨大的相似对象时,可能对内存有......
  • Java基础之RMI与JDNI机制
    一、RMI1.1概念RMI是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力,Java本身对RMI规范的实现默认使用的是JRMP协议。而在Weblogic中对RMI规范的实现使用T3协议JRMP:JavaRemoteMessageProtocol,Java远程消息交换协议。这是运行在JavaRMI之下、TCP/IP之上的线路......
  • Mysql tinyint长度为1时在java中被转化成boolean型(踩坑)
    资料参考链接1:https://www.cnblogs.com/joeylee/p/3878223.html资料参考链接2:https://blog.csdn.net/HD243608836/article/details/118197811目录背景线上事故1污染数据2类型转换异常原因解决方法.背景踩过两次tinyint的坑线上事故1污染数据问题背景tinyint(1)在j......
  • Java 向 Word 模板插入数据(精要)
    PageOffice是一款实用的在线文档编辑工具,它让开发者能够轻松地向Word文档的特定部分动态地插入数据。在PageOffice中,这类特定部分主要涉及两个关键概念:数据区域(DataRegion)和数据标签(DataTag)。1.基本理念数据区域:数据区域实际上是一种特殊的Word书签对象,它位于Word文档......
  • 练习4-1 编写一个函数strrindex(s, t),用于返回字符串t在s中最右出现的位置,如果 s中不
    #include<stdio.h>#include<string.h>intstrrindex(chars[],chart[]){inti,j,k;intlen=strlen(s);for(i=len-1;i>=0;i++){for(j=i,k=0;t[k]!=0&&s[j]==t[k];j++,k++);if(k>0&......
  • Java入门5(多态)
    多态编译时的多态:方法重载运行时的多态:动态绑定多态的三大前提类之间要有继承关系要出现方法重写父类的引用指向了子类的对象测试样例//定义Person类publicclassPerson{publicStringname;publicStringsex;publicintage;publicPerson(St......