全排列_逐步生成结果之迭代_空位上添加字符

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

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/83145759
今日推荐