コンビネーションの問題、再帰的実現
1695 ワード
文字列を入力し、文字列内のすべての文字の組合せを出力します.例えば、abcが入力されると、その組み合わせはa、b、c、ab、ac、bc、abcである.
長さnの文字列でm文字の組合せを求めたいと仮定する.文字列の最初の文字を最初からスキャンします.最初の文字については、2つの選択肢があります.1つは、この文字を組み合わせに置くことです.次に、残りのn-1文字の中でm-1文字を選択する必要があります.二つ目は、この文字を組み合わせに入れないことです.次に、残りのn-1文字の中でm文字を選択する必要があります.どちらの選択も再帰的に実現しやすい.
参照:http://shukuiyan.iteye.com/blog/1095637
長さnの文字列でm文字の組合せを求めたいと仮定する.文字列の最初の文字を最初からスキャンします.最初の文字については、2つの選択肢があります.1つは、この文字を組み合わせに置くことです.次に、残りのn-1文字の中でm-1文字を選択する必要があります.二つ目は、この文字を組み合わせに入れないことです.次に、残りのn-1文字の中でm文字を選択する必要があります.どちらの選択も再帰的に実現しやすい.
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
public class Combination {
public static void combiantion(char chs[]){
if(chs == null || chs.length == 0){
return;
}
List<Character> list = new ArrayList<Character>();
for(int i = 1; i <= chs.length; i++){
combine(chs, 0, 3, list);
}
}
// begin number list
public static void combine(char[] cs, int begin, int number, List<Character> list){
if(number == 0){
System.out.println(list.toString());
return;
}
if(begin == cs.length){
return;
}
list.add(cs[begin]);
combine(cs, begin + 1, number - 1, list);
list.remove((Character)cs[begin]);
combine(cs, begin + 1, number, list);
}
public static void main(String args[]){
char chs[] = {'a','b','c', 'd', 'e'};
combiantion(chs);
}
}
参照:http://shukuiyan.iteye.com/blog/1095637