全排列递归(解决了重复字符问题)

网上有很多讲解全排列递归的算法思路以及程序,所以在此本菜鸟就不再写一遍了。
今天的重点在解决重复字符方面,感觉网上博客里的解决思路大都一致,写一个isSwap函数,然后在递归主体里判断一下函数返回true还是false,大神们也都po出了程序运行图。然而我这么写的程序最终跑不出来预期结果,因此我分析了一下,觉得可以有一个更为简单的办法去重。
要点就是:如果发现待交换的两个字符str[i] == str[k],并且i!=k时,就不交换了,如此即可去重
可运行代码如下(去重判断部分已加粗):
public static ArrayList Permutation(String str)
{
ArrayList list = new ArrayList();
if(str==null || str.length()==0) return list;
perm(list, str.toCharArray(), 0);

return list;
}
public static void perm(ArrayList list, char[] str, int k){
//递归基
if(k==str.length-1){
String chars = new String(str);
list.add(chars);
return;
}
for(int i=k; iif(i==k || (str[i]!=str[k])){
swap(str, k, i);
perm(list, str, k+1);
swap(str,k, i);
}
}

}

public static void swap(char[] str,int i,int j)
{
char temp = str[i];
str[i]=str[j];
str[j]=temp;
}

public static void main(String[] args){
String string = "aba";
ArrayList list = Permutation(string);
for(int i=0; iSystem.out.println(list.get(i));

}
运行结果:
【全排列递归(解决了重复字符问题)】全排列递归(解决了重复字符问题)
文章图片


    推荐阅读