字符串全排列是一道常见的算法题,例如字符串"abc"的全排列是"abc"、"acb"、"bac"、"bca"、"cab"、"cba",这种问题通常使用递归的思想求解。解题思路:首先固定一个字符,对后面的字符进行全排列,以此类推,直到遇到基准情况(仅剩一个字符时)返回调用。以上边的字符串abc为例,首先固定a,对bc进行全排列;之后使a与b交换相当于固定b,对ac进行全排列;递归调用完之后不要忘记还原,再把ab调换回来,最后使ac交换固定c,对ab进行全排列。还要注意一点就是结果去重。例如如果是字符串aab进行全排列则结果会有重复的值,去重的方法可以是将结果存放在集合Set中,或者是判断判断两个交换的值arr[i]和arr[j]是不是相同,如果相同则说明之后排列的过程也是相同的,无需进行下一步跳过即可,顺序查找去重程序代码:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
public class Permutation {
HashSet<String> set = new HashSet<>();
ArrayList<String> list = new ArrayList<>();
public void permute(String str) {
char[] strArr = str.toCharArray();
permute(strArr, 0, strArr.length - 1);
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
private void permute(char[] str, int low, int high) {
if (low == high) {
list.add(String.valueOf(str));
}
for (int i = low; i <= high; i++) {
if(!(str[i] == str[low] && i!=low)){
swap(str, i, low);
permute(str, low + 1, high);
swap(str, i, low);
}
}
}
private void swap(char[] str, int begin, int end) {
char temp;
temp = str[begin];
str[begin] = str[end];
str[end] = temp;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String s = in.nextLine();
Permutation test = new Permutation();
test.permute(s);
}
}
使用集合方法代码:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
public class Permutation {
HashSet<String> set = new HashSet<>();
ArrayList<String> list = new ArrayList<>();
public void permute(String str) {
char[] strArr = str.toCharArray();
permute(strArr, 0, strArr.length - 1);
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
private void permute(char[] str, int low, int high) {
if (low == high) {
set.add(String.valueOf(str));
}
for (int i = low; i <= high; i++) {
swap(str, i, low);
permute(str, low + 1, high);
swap(str, i, low);
}
}
private void swap(char[] str, int begin, int end) {
char temp;
temp = str[begin];
str[begin] = str[end];
str[end] = temp;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String s = in.nextLine();
Permutation test = new Permutation();
test.permute(s);
}
}