非递归做法
用面向对象思想:
将首将字符串转换为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;
}}

京公网安备 11010502036488号