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

没想到按照自己的思路又攻克下了一道题目,在这道题目书写的过程中又进一步复习了java中String以及StringBuilder的用法
总体的解决思路是:
假设输入为a、b、c
那么其实排序的总数:
fun(a,b,c)=a(fun(b,c))+ a和b交换(fun(a,c))+a和c交换(fun(b,a))
fun(b,c) = b+fun(c)+b和c交换(fun(b))
fun(c)=1
所以用递归的方法就可以了,并且在这个递归的过程中,并没有做出一些浪费运行时间的事情,每一个递归都会产生新的结果,因此用递归来解决被称为动态规划的此题,是合理的。
另外题目中说明可能存在重复的字符,因此在进行交换的时候需要判断进行交换的字符是否相等,如果相等就没有必要交换了。

import java.util.ArrayList;
public class Solution {

    public ArrayList<String> PermutationHelp(StringBuilder str){
         ArrayList<String> result = new  ArrayList<String>();
        if(str.length() == 1)result.add(str.toString());
        else{
            for(int i = 0; i < str.length(); i++){
                if(i== 0  || str.charAt(i) != str.charAt(0)){
                    char temp = str.charAt(i);
                    str.setCharAt(i, str.charAt(0));
                    str.setCharAt(0, temp);
                    ArrayList<String> newResult