如“abc”输出结果为:“abc”,“acb”,“bac”,“bca”,“cab”,“cba”
public class AllCombString {
public static int t;//组合个数
public static void main(String[] args) {
String str = "123";
char[] c = str.toCharArray();
println(c)
t++;
allCombString(c,0);
System.out.println(t);
}
public static void allCombString(char[] c,int s){
int l = c.length;
if(l-s==2){
char temp = c[l-1];
c[l-1] = c[l-2];
c[l-2] = temp;
println(c);
t++;
}
else{
for(int i=s;i<l;i++){
moveToHead(c,i,s);
char ct[] = new char[l];
System.arraycopy(c, 0, ct, 0, l);//保持其他元素位置不变
allCombString(ct,s+1);
}
}
}
public static void moveToHead(char[] c,int id,int s){
if(id>s&&id<c.length){
char temp = c[id];
for(int i=id;i>s;i--){
c[i] = c[i-1];
}
c[s] = temp;
println(c);
t++;
}
}
public static void println(char[] c){
System.out.println(new String(c));
}
}
输出结果:
123
132
213
231
321
312
6
设计思路:
1、n个字符,顺序选取其中第1个;
2、在剩下的n-1个字符中,再选取其中的第1个;
3、若剩余的字符只剩下2个,则这两个字符交换位置;若不是,则继续第2步。
4、这是一个典型的递归,无论有多少个字符,到最后只需交换最后两个字符即可。
5、为了能按顺序选取字符(因为递归之后会影响字符的顺序,如:“abcd”经过第一轮递归之后变成“adbc”,这时再执行第2步的话,取到的字符是“d”,而不是“b”),所以这里使用了数组拷贝,for循环不受递归的影响。(这个问题想了老半天,暂时只能用这种方法,即使效率比较低)。
6、组合的个数是字符个数的阶层,如“abc”,组合个数为3!=6
不知道大家有没有更好的方式
public class AllCombString {
public static int t;//组合个数
public static void main(String[] args) {
String str = "123";
char[] c = str.toCharArray();
println(c)
t++;
allCombString(c,0);
System.out.println(t);
}
public static void allCombString(char[] c,int s){
int l = c.length;
if(l-s==2){
char temp = c[l-1];
c[l-1] = c[l-2];
c[l-2] = temp;
println(c);
t++;
}
else{
for(int i=s;i<l;i++){
moveToHead(c,i,s);
char ct[] = new char[l];
System.arraycopy(c, 0, ct, 0, l);//保持其他元素位置不变
allCombString(ct,s+1);
}
}
}
public static void moveToHead(char[] c,int id,int s){
if(id>s&&id<c.length){
char temp = c[id];
for(int i=id;i>s;i--){
c[i] = c[i-1];
}
c[s] = temp;
println(c);
t++;
}
}
public static void println(char[] c){
System.out.println(new String(c));
}
}
输出结果:
123
132
213
231
321
312
6
设计思路:
1、n个字符,顺序选取其中第1个;
2、在剩下的n-1个字符中,再选取其中的第1个;
3、若剩余的字符只剩下2个,则这两个字符交换位置;若不是,则继续第2步。
4、这是一个典型的递归,无论有多少个字符,到最后只需交换最后两个字符即可。
5、为了能按顺序选取字符(因为递归之后会影响字符的顺序,如:“abcd”经过第一轮递归之后变成“adbc”,这时再执行第2步的话,取到的字符是“d”,而不是“b”),所以这里使用了数组拷贝,for循环不受递归的影响。(这个问题想了老半天,暂时只能用这种方法,即使效率比较低)。
6、组合的个数是字符个数的阶层,如“abc”,组合个数为3!=6
不知道大家有没有更好的方式