コンビネーションの問題、再帰的実現

1695 ワード

文字列を入力し、文字列内のすべての文字の組合せを出力します.例えば、abcが入力されると、その組み合わせはa、b、c、ab、ac、bc、abcである.
長さ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