递归法(遍历字符串--每个字符只能取或不取)
package com.duoduo.day316;
public class TestABC {
public static void main(String [] args) {
String s="ABC";
char[] c=s.toCharArray();
StringBuffer sb=new StringBuffer();
for(int i=1;i<=c.length;i++) {
permutation(c,0,i,sb);
}
}
private static void permutation(char[] c,int begin,int len, StringBuffer sb) {
if(len==0) { //当都选择结束时打印sb内容
System.out.println(sb+" ");
return;
}
if(begin==c.length)
return;
sb.append(c[begin]); //取
permutation(c,begin+1,len-1,sb); //剩下的里面选len-1个
sb.deleteCharAt(sb.length()-1); //不取
permutation(c,begin+1,len,sb); //剩下的里面选len个
}
}

全排列(排列树 回溯法)
思路见 https://blog.youkuaiyun.com/Strom72/article/details/80738818

将 s[start] 与[start,end]中的元素依次交换 之后,在进行全排列(递归)
1 2 3 -------1 【2,3】
1 2 3 ----------2【1,3】
1 2 3 -------3 【2,1】
package com.duoduo.day316;
public class TestStr {
public static void main(String [] args) {
String s="ABC";
fullPermutation(s);
}
private static void fullPermutation(String s) {
permutation(s.toCharArray(),0,s.length()-1);
}
private static void permutation(char[] c, int start, int end) {
if(start==end)
System.out.println(new String(c));
else {
for(int i=start;i<=end;i++) {
if(i!=start && c[i]!=c[start] || i==start) { //防止重复
swap(c,i,start);
permutation(c,start+1,end); //继续深度搜索
swap(c,i,start);
}
}
}
}
private static void swap(char[] c, int i, int start) {
char temp=c[i];
c[i]=c[start];
c[start]=temp;
}
}


本文介绍了使用递归实现字符串的全排列与组合算法。通过两种不同的递归方法——遍历字符串每个字符的选择与不选择,以及利用排列树进行回溯法实现全排列,展示了如何生成所有可能的组合及排列。
2659

被折叠的 条评论
为什么被折叠?



