輸入一個字符串,求其所有的組合。例如輸入字符串abc,
則打印出由字符a,b,c所能組合出來的所有字符串a,b,c,ab,ac,bc,abc。
結果請按字母順序輸出。
1:思路:
假設該字符串數組長度爲len,則其組合按長度分類的話有1,2,…..m,….len。在長度爲m的組合中,其分類可分成兩類:包含數組首個元素的和不包含數組首個元素的。
a:包含的,則從餘下的元素中選取m-1個元素的組合
b:不包含的,從餘下的元素中選取m個元素的組合
將a和b兩種情況綜合在一起,便是m個元素的組合方式。
那麼求一個數組的所有組合方式的話,要對其長度做一個循環,將所有組合方式綜合起來。
2 : 方法:
(1)求在數組arr中,m個元素的組合,下標從begin-1開始,即分爲包含該小標元素和不包含該下標元素的情況。
/**
*
* @param arr 字符串數組
* @param begin 開始數(下標+1)
* @param num 組合個數
* @return
*/
public static ArrayList<String> cal(String[] arr,int begin,int num){
ArrayList<String> result=new ArrayList<String>();
if(num<=0){
return null;
}
if(begin>arr.length){
return null;
}
if(num-1>arr.length-begin){
return null;
}
//1:contain first
String first=arr[begin-1];
ArrayList<String> test=cal(arr,begin+1,num-1);
if(test!=null){
for(String a:test){
a=first+a;
//System.out.println(a);
result.add(a);
}
}
if(num==1){
result.add(first);
}
//2:do not contain the first
ArrayList<String> test2=cal(arr,begin+1,num);
if(test2!=null){
for(String o:test2){
result.add(o);
}
}
return result;
}
(2)對數組長度進行循環求組合
ArrayList<String> result=new ArrayList<String>();
for(int i=0;i<arr.length;i++){
result.addAll(cal(arr,1,i+1));
}
- 思考:如果是求所有字符的排列該如何求–明天見咯?