非递归做法
用面向对象思想:
将首将字符串转换为char字符数组 遍历字符确定有多少个字符对象并记录下用的次数,然后自由组合。然后取出不满足的。就如同我们平时用的数字,数字有十个对象,自由组合可以组成各种个样的数
。import java.util.ArrayList;
import java.util.TreeSet;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class Solution {
public ArrayList<string> Permutation(String str) {
char[]c=str.toCharArray();
Integer [] c0=new Integer [c.length];
ArrayList<string>asList=new ArrayList<string>();
ArrayList<Integer[]>arr=new ArrayList<Integer[]>();
for(int i=0;i<c.length;i++) {
c0[i]=i;
}
for(int i=0;i<c.length;i++){
arr.add(c0);
}
ArrayList<Integer[]>arr1=new ArrayList<Integer[]>();
for(int i=0;i<arr.size();i++) {</string></string></string>

           ArrayList<Integer[]>temp=new ArrayList<Integer[]>();
           for(int j=0;j<arr.get(i).length;j++) {

                  if(i==0) {
                      Integer []ai=new Integer [i+1];
                      ai[i]=arr.get(i)[j];
                       temp.add(ai);
                  }else {
                      for(Integer[] a:arr1) {
                          Integer []ai=new Integer [i+1];
                          ai[i]=arr.get(i)[j];
                         Savepoint(a, ai);
                         temp.add(ai);
                      }


                  }

           }
           arr1=temp;

       }
       //去重
       for(int i=0;i<arr1.size();i++) {

           if(!qc(arr1.get(i))) {
               arr1.remove(i);i--;
           }
       }
       //转换字符串
       for(int i=0;i<arr1.size();i++) {
           StringBuffer sBuffer=new StringBuffer();
           for(Integer a:arr1.get(i)) {
               sBuffer.append(c[a]);
           }
           asList.add(sBuffer.toString());
       }
       //字符串去
       Set<String>arrayList=new TreeSet<String>();
         for(int i=0;i<asList.size()-1;i++){
             for(int j=i+1;j<asList.size();j++){
                 if(asList.get(i).equals(asList.get(j))) {
                    arrayList.add(asList.get(i)) ;
                 } 
             }
         }
         asList.removeAll(arrayList);
         asList.addAll(arrayList);
         //arrayList.clear();
         arrayList.addAll(asList);
         asList.clear();
         asList.addAll(arrayList);
        return asList;
    }

 public void Savepoint(Integer []a,Integer []b) {
     if(a.length>=b.length) {
         for(int i=0;i<b.length;i++) {
             a[i]=b[i];
         }
     }else {
         Savepoint(b, a);
     }

 }
 //判断是否重复
 public boolean qc(Integer [] a) {
    Set<Integer> set=new HashSet<Integer>();
    for(int i=0;i<a.length;i++) {
        set.add(a[i]);
    }
    if(a.length==set.size()) {return true;}
    return false;
}

}