全排列_逐步生成結果之迭代_空位上新增字元
1.問題描述:
輸入一個字串,輸出該字串的全部全排列集合
2.思路描述:我們先從簡單的例子開始考慮:假如輸入的字串為 ABC
我們先考慮A,可以在A的所有空位上新增上當前元素B,可以得到 {BA,AB},對得到的字串集合再進行添加當前元素那麼可以在BA的所有空位上新增元素,得到的集合為{ CBA,BCA,BAC} 在AB的所有空位上新增元素得到的集合為{ CAB,ACB,ABC}
那麼就得到了ABC的全部全排列,那麼多個字元的處理也是一樣的,思路與上面的一樣。思路有了,我們需要對上一次得到的集合進行臨時的儲存,而且需要建立兩個list,一個是在初始化的時候建立,另外一個是在for迴圈裡面建立(臨時儲存的作用),for迴圈遍歷的是原來就已經存在集合,我們需要在遍歷的時候往原來的集合中新增元素,然後把新增好元素的集合賦值給原來的下次下一次才可以正確遍歷。
其中需要解決的問題是:如何在空位上添加當前元素,在最外層的for迴圈中表示的是當前需要新增的字元,裡面遍歷原來的舊的集合,並且在迴圈中建立一個一個list來儲存當前新增新元素的集合,最終把新的集合賦值給舊的集合,遍歷之後就需要往空位上新增字元,因為空位上存在多個,所以使用一個for迴圈,這裡使用到了拼接字串的方法:substring(index)和substring(firstIndex,lastIndex)方法
substring(index)方法可以擷取從index到字串結尾的字串
substring(firstIndex,lastIndex):擷取的字串為從firstIndex ~ lastIndex - 1索引之間的字串,所以不包括lastIndex這個字元
當firstIndex = = lastIndex的時候擷取字串的字串為空
程式碼中還使用到了對list元素進行排序的方法:Collections.sort(需要排序的list) 去除字串空格的方法:String物件的replaceAll()方法
3.具體的程式碼如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//去除字串中的空格:trim()方法去除的是字串前後的空格 replaceAll()方法是替換所有的空格
String str = sc.nextLine().replaceAll(" ", "");
List<String> list = solve(str);
System.out.println(list.size());//對集合中的元素進行排序
Collections.sort(list);
for(String strOuput : list){
System.out.println(strOuput);
}
}private static List<String> solve(String str) {
int n = str.length();
List<String> srcStr = new ArrayList<>();
if(n == 0){
return srcStr;
}
srcStr.add(str.charAt(0) + "");
for(int i = 1; i < n; i++){
List<String> strNew = new ArrayList<>();
for(String srcStr1 : srcStr){
for(int j = 0; j <= srcStr1.length(); j++){//n 個字元有n + 1的空格可以插入元素所以迴圈的長度為srcStr1.length() + 1
String str1 = srcStr1.substring(0, j) + str.charAt(i) + srcStr1.substring(j);
strNew.add(str1);
}
}
srcStr = strNew;
}
return srcStr;
}
}