劍指offer第二版面試題38:字串的排列(java)
阿新 • • 發佈:2019-02-19
題目描述:
輸入一個字串,打印出該字串中字元的所有排列。
例如輸入字串abc,則列印由字元a,b,c所能排列出來的所有字串:abc,acb,bac,bca,cab,cba
分析:
我們求整個字串的排列,可以看成兩步:首先求出所有可能出現在第一個位置的字元,即把第一個字元和後面所有的字元交換。第二步固定第一個字元,求後面所有字元的排列。這個時候我們仍把後面的所有字元分成兩部分:後面字元的第一個字元,以及這個字元之後的所有字元。然後把第一個字元逐一和它後面的字元交換。
程式碼如下:
/**
* 字串的排列 前提:字串中的每個字元都是不相同的
*/
public class StringPermutation {
public static void main(String[] args) {
String str = "abcd";
char[] arr = str.toCharArray();
permutation(arr, 0);
}
public static void permutation(char[] arr, int begin) {
if (begin == arr.length - 1) {
String result = new String(arr);
System.out.println(result);
} else {
for (int i = begin; i < arr.length; i++) {
swap(arr, begin, i);
permutation(arr, begin + 1);
swap(arr, begin, i);
}
}
}
public static void swap(char[] arr, int index1, int index2) {
char temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}