剑指offer(27)字符串的排列

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

       思路描述:递归思想:将字符串化为char类型的数组,如果只有一个字符,则直接输出,否则从第一个字符开始,每次与第一个字符串进行交换,剩余字符串依次与子串中的第一个字符串进行交换,直到最后一个字符,返回结果。每次交换后,都要再次交换过来,保证下次交换的正确性。

剑指offer(27)字符串的排列

代码:

import java.util.*;
public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> result =new ArrayList<String>();
        if(str == null || str.length() == 0)
            return result;
        char [] ch = str.toCharArray();
        TreeSet<String> temp = new TreeSet<>();//treeset用来保证结果不重复,并保持字典序
        PrintAll(ch, 0, temp);
        result.addAll(temp);
        return result;
    }
    
    public static void PrintAll(char[] ch, int start, TreeSet<String> temp){
        if(ch == null || ch.length == 0||start < 0|| start > ch.length -1)
            return;
        if(start == ch.length - 1)
            temp.add(String.valueOf(ch));
        for(int i = start; i <= ch.length - 1;i++){
            swap(ch,start,i);
            PrintAll(ch,start + 1,temp);
            swap(ch,start,i);//交换回去,保证正确性
        }
    }
    public static void swap(char[] ch, int a, int b){
        char temp = ch[a];
        ch[a] = ch[b];
        ch[b] = temp;
        
    }
}