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

Posted 我不想一直当菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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,再继续回溯下一层直到排列完成,再撤销选择回到未被标记状态。

代码:

 class Solution 
      List<String> result = new ArrayList<>();
     //暂存结果
     StringBuffer temp = new StringBuffer();
     public String[] permutation(String s) 
         //将字符串转换为字符串数组
         char[] chars = s.toCharArray();
         //将字符数组进行排序
         Arrays.sort(chars);
         //定义一个boolean数组标记使用过的数组
         boolean[] used = new boolean[chars.length];
         //初值全为未被使用
         Arrays.fill(used, false);
         //求出排列
         backtracking(chars, used);
         //返回结果
         return result.toArray(new String[result.size()]);
     
     public void backtracking(char[] chars, boolean[] used)
         //如果暂存的path长度等于字符数组的长度,说明已经找到一个
         if (temp.length() == chars.length) 
             result.add(temp.toString());
             return;
         
         for (int i = 0; i < chars.length; i++)
             if (i > 0 && chars[i] == chars[i-1] && used[i-1] == false)
                 continue;
             
             if (used[i] == false)
                 used[i] = true;
                 temp.append(chars[i]);
                 //在排列剩下的
                 backtracking(chars, used);
                 //回溯,弹出当前这一个,回到上一步的位置
                 temp.deleteCharAt(temp.length() - 1);
                 //将used回到初始状态
                 used[i] = false;
             
         
     
 

小感悟:

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

 

剑指 Offer 12. 矩阵中的路径中等难度

矩阵中的路径【中等难度】

题目

矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
 
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
 
例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。

示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true

示例 2:
输入:board = [[“a”,“b”],[“c”,“d”]], word

以上是关于剑指offer38(Java)-字符串的排列(中等)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(剑指 Offer)- 38. 字符串的排列

剑指offer--38字符串的排列

剑指offer--38字符串的排列

LeetCode 字符串的排列全排列问题(剑指offer38)

剑指 Offer 38. 字符串的排列

剑指 Offer 38. 字符串的排列