【剑指offer】面试题38:字符串的排列(Java)
问题分析:我们需要生成一个字符串中所有可能的排列,排列必须是不重复的。 直观思路:回溯法可以帮助我们逐步构建每个排列,并通过检查来避免重复。 优化思路:为了提高效率,可以先对字符数组进行排序,这样可以减少重复的检查。 初始化:我们首先初始化结果列表、访问标记数组、字符数组以及字符串构建器。 排序:对字符数组进行排序,这样可以确保在选择相同字符时能够有效地跳过重复的选择。 递归方法:使用递归的helper方法来生成所有排列。在递归过程中,我们检查当前字符是否已经被访问过,如果没有,则继续递归。 回溯:在递归返回后,删除当前字符并重置访问标记,以便生成下一个排列。
发布日期: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; } } }} 代码结构解析
这种方法能够高效地生成所有字符的排列,并确保每个排列都是唯一的。通过对字符数组的排序和访问标记的使用,我们能够有效地避免重复排列的生成。
发表评论
最新留言
不错!
[***.144.177.141]2026年05月20日 15时36分39秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP设计模式:观察者模式
2023-03-02
php访问mysql(1)
2023-03-02
php详细学习1
2023-03-02
php语言优劣
2023-03-02
PHP语言最优雅的支付SDK扩展包
2023-03-02
PHP请求https域名发生segment fault段错误
2023-03-02
PHP读写XML文件
2023-03-02
PHP读写XML文件
2023-03-02
R&Python Data Science 系列:数据处理(3)
2023-03-02
php读取xml 数据库字段超长处理
2023-03-02
php课程 12-40 抽象类的作用是什么
2023-03-02
php课程 4-16 数组自定义函数(php数组->桶)
2023-03-02
PHP调用接口用post方法传送json数据
2023-03-02
php转化IP为整形
2023-03-02
php输出数据到csv文件
2023-03-02
php输出语句
2023-03-02
php运行原理详细说明
2023-03-02
php运行环境出现Undefined index 或variable时解决方法
2023-03-02
php进程通信
2023-03-02
R&Python Data Science 系列:数据处理(2)
2023-03-02