全排列与组合
组合 对于一个给定的字符串,我们有如下考虑得到所有的组合可能,即对于每一个字符,可以选择加入或者不加入,直到整个字符串中的所有字符经过这个过程则返回
全排列 对于一个给定的字符串(其长度为n),我们有如下考虑得到所有可能的排列,将当前长度为n的串中的每一个字符均放在第一个位置,对这n种可能进行长度为n-1的字符串(从上一操作串的第二个位置开始)进行同样的操作,直到处理串的长度等于1即可输出这个串
// 组合
public static String combination(String src, String dest, int pos){
StringBuilder sb = new StringBuilder();
if(pos == src.length()){ // 没有剩余字符
if(dest.length() != 0){ // 排除所有字符均木有加入的情况(空串)
return dest;
}
return null;
}
String str1 = combination(src, dest, pos + 1); // pos位置上的字符不加入到dest中
if(str1 != null){
sb.append(str1 + " ");
}
String str2 = combination(src, dest + src.charAt(pos), pos + 1); // pos位置上的字符加入到dest中
if(str2 != null){
sb.append(str2);
}
return sb.toString().trim();
}
// 排列
public static String permutation(String src, int begin){
StringBuffer sb = new StringBuffer();
if(begin == src.length() - 1){ // 只剩下一个字符
return src;
}
for(int i = begin; i < src.length(); i++){
src = swap(src, begin, i); // 将当前src(由begin到src.lenght()-1)的begin处的字符与所有字符交换一次
String str = permutation(src, begin + 1);
sb.append(str + " ");
}
return sb.toString().trim();
}
private static String swap(String src, int i, int j){
char[] chars = src.toCharArray();
char ch = chars[i];
chars[i] = chars[j];
chars[j] = ch;
String str = new String();
for(int ii = 0; ii < chars.length; ii++){
str += chars[ii];
}
return str;
}