字符串全排列是一道常見的算法題,例如字符串"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);
}
}