题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

示例1

输入
"ab"
返回值
["ab","ba"]

code

import java.util.*;
public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> res = new ArrayList<>();
        char[] chs = str.toCharArray();
        Arrays.sort(chs);
        res.add(str);
        while(true){
            String a = nextString(chs);
            if(a.equals("finish"))break;
            res.add(a);
        }
        return res;
    }

    private String nextString(char[] chs){
        int n = chs.length;
        int i = n-1,j = n-1;
        //找到升序,例如68,i指向8
        while(i>0 && chs[i-1]>=chs[i]) i--;
        if(i==0)return "finish";
        //找到i及i后面数中。比i-1元素大的数,例如7
        while(j>0 && chs[j]<=chs[i-1]) j--;
        //交换i-1和j
        swap(chs,i-1,j);
        //将i及后面的元素序列翻转
        for(int a=i,b=n-1;a<b;a++,b--){
            swap(chs,a,b);
        }
        return new String(chs);
    }
    private void swap(char[] chs,int a,int b){
        char temp = chs[a];
        chs[a]=chs[b];
        chs[b]=temp;
    }
}