输出字符串的排列数和组合数都是通过递归的方式实现的,直接上代码吧
1 输出一个字符串的所有排列数
import java.util.ArrayList;
public class Pailie {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
printC("",list);
}
private static void printC(String cha,ArrayList<String> list){
if(list == null || list.size() == 0)
return;
if(list.size() == 1){
System.out.print(cha);
System.out.print(list.get(0) + "\n");
return;
}
for(int i=0;i<list.size();i++){
String ch = list.get(i);
ArrayList<String> listT = new ArrayList<>();
listT.addAll(list);
listT.remove(i);
printC(cha+ch,listT);
}
}
}
2 输出一个字符串的任意组合数
import java.util.ArrayList;
public class ZuHe {
/**算法思想:取长度为n的字符串个数为m的组合数,从字符串首字母开始遍历,分解问题为,取除首字母外长度为n-1子字符串m-1的组合数,
**,依次类推取n-2的m-2的组合数,递归的出口为m=1
**/
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
//输出列表list,3的组合数
String[] aimList = new String[3];
printZuHe(list, aimList, 3, 0, 3);
}
/**
*
* @param list
* @param aimList
* @param len 组合数的个数
* @param start
* @param num 还需要取多少个字符
*/
private static void printZuHe(ArrayList<String> list,String[] aimList,int len,int start,int num){
for(int i=start;i<list.size();i++){
aimList[len-num] = list.get(i);
if(num==1){
for(int k=0;k<aimList.length;k++){
System.out.print(aimList[k]);
}
System.out.print("\n");
}else{
printZuHe(list, aimList,len,i+1,num-1);
}
}
}
}