全排列递归(解决了重复字符问题)
网上有很多讲解全排列递归的算法思路以及程序,所以在此本菜鸟就不再写一遍了。
今天的重点在解决重复字符方面,感觉网上博客里的解决思路大都一致,写一个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;
i
}
运行结果:
【全排列递归(解决了重复字符问题)】
文章图片
推荐阅读
- 危险也是机会
- 活着就是生命的全部意义
- 一个健康的APP和健全的人格大体类似
- NeuVector 会是下一个爆款云原生安全神器吗()
- 全过程工程咨询——时间管理(12)
- 别墅庭院设计,不同的别墅庭院设计也给人视觉上完全不一样的!
- 不让记忆、感觉、情绪成为孩子的负累|不让记忆、感觉、情绪成为孩子的负累|《全脑教养法》(四)
- (全员向连载)云间当铺(一)
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 全职妈妈在4岁孩子眼中只是一个loser