今天刚做完排列A(m,n)问题,又来个组合问题,开始以为差不多,后面发现还有有点差距的,话不多说,列出代码,以方便后面回顾。
package sky_100;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
* @author Benett
* @date 2017年8月23日 下午11:45:24
* @version 1.0
*/
public class Combination {
public static void main(String[] args) {
String str = "dabc";
List<String> cr = getCombinationResult(2, stringFilter(str));
for(String s: cr){
System.out.println(s);
}
}
/**
* 对字符串中元素进行重排序
* 此外还可以在该方法对元素进行去重等
* @param str 原字符串
* @return 目标字符串
*/
public static String stringFilter(String str){
char[] c = str.toCharArray();
Arrays.sort(c);
return new String(c);
}
/**
* 得到组合结果
* @param num 从N个数中选取num个数
* @param str 包含Ng个元素的字符串
* @return 组合结果
*/
public static List<String> getCombinationResult(int num, String str) {
List<String> result = new ArrayList<String>();
if (num == 1) {
for (char c : str.toCharArray()) {
result.add(String.valueOf(c));
}
return result;
}
if (num >= str.length()) {
result.add(str);
return result;
}
int strlen = str.length();
for (int i = 0; i < (strlen - num + 1); i++) {
List<String> cr = getCombinationResult(num - 1, str.substring(i + 1));//从i+1处直至字符串末尾
char c = str.charAt(i);//得到上面被去掉的字符,进行组合
for (String s : cr) {
result.add(c + s);
}
}
return result;
}
}