网络上很多关于这部分都没有细讲去重部分,这里我来详细讲解一下。但是前提是你了解,非重复元素下的全排列问题。
下面放图讲解:
具体实现代码如下:
private static boolean used(char[] list, int k, int m) {
for (int i = k; i < m; i++) {
if(list[m] == list[i])
return true;
}
return false;
}
下面展示全代码:
package com.chenhao.Demo;
import java.util.Scanner;
public class Perm2 {
public static int count = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入元素个数:");
int n = sc.nextInt();
sc.nextLine();//
System.out.println("请输入元素:");
String str = sc.nextLine(); // 使用nextLine读取一行输入
char[] list = str.toCharArray(); // 将字符串转换为字符数组
if (list.length != n) {
System.out.println("输入的字符个数与指定的个数不匹配!");
return;
}
perm(list, 0, n - 1);
System.out.println("元素个数为:" + count);
}
public static void perm(char[] list, int k, int m){ //产生list[k:m]的所有排列
if(k == m ){
for (int i = 0; i <= m; i++) {
System.out.print(list[i]);
}
System.out.println();
count++;
}else {
for (int i = k; i <= m ; i++) {
if ( !used(list, k, i)) { //当前元素是否被使用过
Swap(list, k, i);
perm(list, k + 1, m);
Swap(list, k, i);
}
}
}
}
private static boolean used(char[] list, int k, int m) {
for (int i = k; i < m; i++) {
if(list[m] == list[i])
return true;
}
return false;
}
private static void Swap(char[] list, int i, int j) {
char temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}