【剑指offer】面试题38:字符串的排列(Java)
发布日期:2021-04-30 21:00:16 浏览次数:243 分类:精选文章

本文共 1533 字,大约阅读时间需要 5 分钟。

字符串排列生成

为了生成一个字符串的所有排列,我们可以使用回溯法来解决这个问题。这种方法能够有效地避免重复元素并生成所有可能的排列。

解决问题的思路

  • 问题分析:我们需要生成一个字符串中所有可能的排列,排列必须是不重复的。
  • 直观思路:回溯法可以帮助我们逐步构建每个排列,并通过检查来避免重复。
  • 优化思路:为了提高效率,可以先对字符数组进行排序,这样可以减少重复的检查。
  • 代码实现

    public class Solution {    public String[] permutation(String s) {        List
    result = new ArrayList<>(); boolean[] visited = new boolean[s.length()]; char[] arr = s.toCharArray(); Arrays.sort(arr); StringBuilder x = new StringBuilder(); helper(result, visited, arr, x); String[] res = new String[result.size()]; for (int i = 0; i < result.size(); i++) { res[i] = result.get(i); } return res; } private void helper(List
    result, boolean[] visited, char[] arr, StringBuilder x) { if (x.length() == arr.length) { result.add(x.toString()); return; } for (int i = 0; i < arr.length; i++) { if (i != 0 && arr[i] == arr[i - 1] && visited[i - 1]) { continue; } if (!visited[i]) { x.append(arr[i]); visited[i] = true; helper(result, visited, arr, x); x.deleteCharAt(x.length() - 1); visited[i] = false; } } }}

    代码结构解析

  • 初始化:我们首先初始化结果列表、访问标记数组、字符数组以及字符串构建器。
  • 排序:对字符数组进行排序,这样可以确保在选择相同字符时能够有效地跳过重复的选择。
  • 递归方法:使用递归的helper方法来生成所有排列。在递归过程中,我们检查当前字符是否已经被访问过,如果没有,则继续递归。
  • 回溯:在递归返回后,删除当前字符并重置访问标记,以便生成下一个排列。
  • 这种方法能够高效地生成所有字符的排列,并确保每个排列都是唯一的。通过对字符数组的排序和访问标记的使用,我们能够有效地避免重复排列的生成。

    上一篇:题目 2056: 汉诺塔 题解
    下一篇:Java中的迭代器遍历集合

    发表评论

    最新留言

    不错!
    [***.144.177.141]2026年05月20日 15时36分39秒