【Offer】[38] 【字符串的排列】

题目描述

  输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、 bac、bca、cab和cba。
  

牛客网刷题地址

思路分析

  将字符串看成两部分,第一部分为第一个位置的字符,第二部分为剩下的字符,那么,要求这个字符串的操作就可以分为两步:
  1. 求第一部分可能出现在第一个位置的字符,即第一个字符和其后面的所有字符交换
  2. 求后面字符的排列,这就又回到了原来的问题。可以利用递归。

测试用例

  1. 功能测试:输入的字符串中有一个或者多个字符。
  2. 特殊输入测试:输入的字符串的内容为空或者nullptr指针。

Java代码

public class Offer38 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        
    }

    public ArrayList<String> Permutation(String str) {
        return Solution1(str);
    }

    private static ArrayList<String> Solution1(String str) {
        ArrayList<String> list = new ArrayList<String>();
        if(str==null || str.length()==0){
            return list;
        }
        permutationCore(str.toCharArray(),0,list);
        Collections.sort(list);
        return list;
    }
    
     private static void permutationCore(char[] array,int index,ArrayList<String> list){
            if(index == array.length-1){
                if(!list.contains(String.valueOf(array))){
                    list.add(String.valueOf(array));
                }
            }else{
                for(int i=index;i<array.length;i++){
                    char tmp = array[index];
                    array[index] = array[i];
                    array[i] = tmp;
                    permutationCore(array,index+1,list);
                    array[i]=array[index];
                    array[index] = tmp;   
                }
            }
        }

    private static void test1() {

    }

    private static void test2() {

    }
    private static void test3() {

    }

}

代码链接

剑指Offer代码-Java

猜你喜欢

转载自www.cnblogs.com/haoworld/p/offer38-zi-fu-chuan-de-pai-lie.html