目录
1.前言
2.题目解析
3.算法原理
4.代码实现
1.前言
在编程练习中,字符串的全排列问题是一个经典的算法问题。通过对字符串进行全排列,可以得到该字符串的所有可能的排列组合。本文将探讨如何对含有重复字符的字符串进行全排列,并且解决重复元素导致的问题。
2.题目解析
题目要求实现一个字符串排序的算法,即对输入的字符串进行全排列,并返回所有可能的排列组合。需要考虑输入字符串中存在重复字符的情况,确保不会出现重复的排列。
3.算法原理
针对含有重复字符的字符串进行全排列,需要使用深度优先搜索(DFS)算法结合剪枝操作来解决。在深度优先搜索过程中,需要对重复元素进行剪枝,以确保得到的排列不会包含重复的结果。
4.代码实现
package study2.day33;import java.util.ArrayList;
import java.util.Arrays;/*** @Description: 字符串排序 就是求全排列* 错误原因不知道有重复字符应该怎么处理* 解决分析:排序 + dfs 填空 相同树剪枝 a___ a___ 相同需要剪枝 (aabc的全排列)* 就是含有相同元素的全排列* @Author: windStop* @Date: 2024/5/23 14:29*/
public class Test3 {StringBuilder sb = new StringBuilder();ArrayList<String> result = new ArrayList<>();private boolean[] cheak;//判断是否已经枚举过了public ArrayList<String> Permutation (String str) {char[] chs = str.toCharArray();Arrays.sort(chs);cheak = new boolean[chs.length];dfs(chs);return result;}private void dfs(char[] chs) {int n = chs.length;if (sb.length() == n){result.add(sb.toString());sb = new StringBuilder();return;}for (int i = 0; i < n; i++) {if (!cheak[i]){if (i >= 1 && chs[i] == chs[i - 1] && !cheak[i - 1]) continue;//相同位置的相同元素(相同树剪枝)sb.append(chs[i]);cheak[i] = true;dfs(chs);//递归完毕,进行回溯的时候说明已经是搞完了再往上返回//恢复现场cheak[i] = false;sb.delete(i,i + 1);}}}
}