問題:字符串abcd怎樣獲取abcd、acbd、acdb、adbc、adcb、bacd、bcad、bdac、bdca、cabd、cdba、cadb、cbda等,所有排列。
使用回溯法來生成一個字符串的所有排列
import java.util.ArrayList;
import java.util.List;public class Permutations {public static void main(String[] args) {// 目標字符串String str = "abcd";// 調用permute方法獲取所有排列,并打印結果List<String> permutations = permute(str);for (String permutation : permutations) {System.out.println(permutation);}}/*** 生成字符串的所有排列。* @param str 輸入的字符串* @return 包含所有排列的列表*/private static List<String> permute(String str) {List<String> result = new ArrayList<>();// 如果字符串為空或長度為0,則返回空列表if (str == null || str.length() == 0) {return result;}// 使用字符數組,并從第一個字符開始進行排列char[] chars = str.toCharArray();permuteHelper(chars, 0, result);return result;}/*** 遞歸輔助方法,用于生成排列。* @param chars 字符數組,用于交換字符以生成排列* @param index 當前處理字符的位置索引* @param result 存儲所有排列結果的列表*/private static void permuteHelper(char[] chars, int index, List<String> result) {// 如果已經處理到最后一個字符,將當前排列加入結果列表if (index == chars.length - 1) {result.add(new String(chars));} else {// 對于每個未處理的字符,都嘗試將其放在當前位置for (int i = index; i < chars.length; i++) {// 交換當前字符與待處理字符swap(chars, index, i);// 遞歸處理下一個字符位置permuteHelper(chars, index + 1, result);// 回溯:恢復交換前的狀態,以便嘗試下一個字符swap(chars, index, i);}}}/*** 交換字符數組中的兩個元素。* @param array 字符數組* @param a 第一個元素的索引* @param b 第二個元素的索引*/private static void swap(char[] array, int a, int b) {char temp = array[a];array[a] = array[b];array[b] = temp;}
}