输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc
这题目估计大家都不陌生了,网上很多都一个递归方法解决,现在介绍一种非主流解决方法,来,让我们看代码:
/**
* @param args
*/
public static void main(String[] args) {
String temp = "abcdefghijklnmopqrstu";
String[] results = getResult(temp);
}
private static String[] getResult(String str){
int start = 1;
int strSize = str.length();
double max = Math.pow(2, strSize-1);
double total = Math.pow(2, strSize)-1;
String[] result = new String[(int)total];
int step;
int index;
StringBuilder sb;
while (start <= total) {
sb = new StringBuilder();
step = 1;
index = 0;
while (step <= max) {
int temp = step & start;
if (temp != 0) {
sb.append(str.charAt(index));
}
step <<= 1;
index++;
}
result[start -1] = sb.toString();
start++;
}
return result;
}
上面的总体思路是酱紫的:n个字符的所有组合个数就是2^n -1 个。既然我们可以知道总数,那么不妨把这些数字换成二进制码,就有2^n -1组二进制码,细心观察这些0101的二进制码,我们就会发现里面隐藏着一个规律,那就假如我们把那组二进制跟我们的字符串联想在一起,然后把出现1的位置的字符连起来,不就是对应其中一种组合情况吗?换种说法,那2^n -1个数所对应的二进制码,就是我们要的组合啊。那么接下来我们只需要把里面1的索引位置找出来,把字符串里面对应索引的字符取出来拼在一起就行了~~ 当然我觉得这里还有优化的余地,例如如何更快地找出1所在的位置之类~~
还有,假如目标字符串是26个字母,这种算法列出组合,比网上的那些递归方法快差不多一倍(前提条件是不记录结果,或者直接输出结果,因为记录所有结果需要大量内存,不加内存会爆的........)~~~
这题目估计大家都不陌生了,网上很多都一个递归方法解决,现在介绍一种非主流解决方法,来,让我们看代码:
/**
* @param args
*/
public static void main(String[] args) {
String temp = "abcdefghijklnmopqrstu";
String[] results = getResult(temp);
}
private static String[] getResult(String str){
int start = 1;
int strSize = str.length();
double max = Math.pow(2, strSize-1);
double total = Math.pow(2, strSize)-1;
String[] result = new String[(int)total];
int step;
int index;
StringBuilder sb;
while (start <= total) {
sb = new StringBuilder();
step = 1;
index = 0;
while (step <= max) {
int temp = step & start;
if (temp != 0) {
sb.append(str.charAt(index));
}
step <<= 1;
index++;
}
result[start -1] = sb.toString();
start++;
}
return result;
}
上面的总体思路是酱紫的:n个字符的所有组合个数就是2^n -1 个。既然我们可以知道总数,那么不妨把这些数字换成二进制码,就有2^n -1组二进制码,细心观察这些0101的二进制码,我们就会发现里面隐藏着一个规律,那就假如我们把那组二进制跟我们的字符串联想在一起,然后把出现1的位置的字符连起来,不就是对应其中一种组合情况吗?换种说法,那2^n -1个数所对应的二进制码,就是我们要的组合啊。那么接下来我们只需要把里面1的索引位置找出来,把字符串里面对应索引的字符取出来拼在一起就行了~~ 当然我觉得这里还有优化的余地,例如如何更快地找出1所在的位置之类~~
还有,假如目标字符串是26个字母,这种算法列出组合,比网上的那些递归方法快差不多一倍(前提条件是不记录结果,或者直接输出结果,因为记录所有结果需要大量内存,不加内存会爆的........)~~~