剑指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. 字符串的排列