剑指offer习题记录二

题目描述

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

解题思路

此题可以用递归解决,问题可以分解为:
1、首先固定第一个字符
2、对剩下的字符进行全排列
3、将固定的字符分别与已经求出全排列的字符串进行每位交换

程序代码

package com.offer;
import java.util.ArrayList;
import java.util.TreeSet;

public class Permutation {

    public ArrayList<String> Permutation(String str) {
        ArrayList<String> result = new ArrayList<>();
        TreeSet<String> temp = new TreeSet<>();
        if(str.length()==0|str == null){return result;}
        char[] str_char = str.toCharArray();
        sub_Permutation(str_char,0,temp);
        result.addAll(temp);
        return result;    
    }
    public void sub_Permutation(char[] str,int i,TreeSet<String> result){


        if(i < 0 || i >= str.length){
            return ;
        }
        if(i == str.length-1){
            result.add(String.valueOf(str));
        }else{
            for(int j = i;j<str.length;j++){
                swap(str, i, j);
                sub_Permutation(str,i+1,result);
                swap(str, i, j);    
            }
        }
    }
    public void swap(char[] str,int i,int j){
        char temp;
        temp = str[i];
        str[i]= str[j];
        str[j] =temp;           
     }
    public static void main(String ags[]){
        String str = "a";
        ArrayList<String> test = new ArrayList<>();
        Permutation s = new Permutation();
        test = s.Permutation(str);
        System.out.println(test);
    }

}

猜你喜欢

转载自blog.csdn.net/patrisk/article/details/80670445