-------
android培训、
java培训、期待与您交流! ----------
题目:
输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。
思路:
可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m)。原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和。对于求C(n, m),从第一个字符开始扫描,每个字符有两种情况,要么被选中,要么不被选中,如果被选中,递归求解C(n-1, m-1)。如果未被选中,递归求解C(n-1, m)。不管哪种方式,n的值都会减少,递归的终止条件n=0或m=0。
package com.test;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Test6 {
/**
* 原始字符串是"abc",打印得到下列所有组合情况 "a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc"
* "acb" "bac" "bca" "cab" "cba"
*/
//使用递归
public static void combine(char[] a, int begin, int resultLength, List<Character> list) {
//当长度达到要求就打印结果,并结束
if (resultLength == 0) {
System.out.println(list.toString());
return;
}
//当所有的字符都被使用时结束
if (begin == a.length) {
return;
}
//选择当前字符
list.add(a[begin]);
//递归第下个字符的情况
combine(a, begin + 1, resultLength - 1, list);
//不选择当前字符(前面已经选择,现在要把他剔除)
list.remove((Character) a[begin]);
//继续递归
combine(a, begin + 1, resultLength, list);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] a = { 'a', 'b', 'c' };
List<Character> list = new ArrayList<Character>();
for (int i = 1, len = a.length; i <= len; i++) {
combine(a, 0, i, list);
}
}
}