1. 程式人生 > >全排列_逐步生成結果之迭代_空位上新增字元

全排列_逐步生成結果之迭代_空位上新增字元

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;
    }
}