将M个A和N个B,组合成一个长度为(M+N)的字符串,每个新组成的字符串中都包含M个A和N个B,现在要输出组合的全部字符串,怎么编程实现?有一定难度哦,望高手解决一下,谢谢。
解决方案 »
- 异常:Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: com.wsb.pub.Item cannot 怎么解决
- this的疑惑
- 100分:为什么输出这个
- 关于java模拟ie登陆web的问题?
- 如何控制文件的读取冲突?
- java serversocket 最多只能连接5个socket
- 请问如何在JTextPane中禁止使用Ctrl+v,Ctrl+x,Ctrl+c?
- 数据库问题
- 高程下午题怎么不考java? 呵呵~~明天考试 散分
- J2EE和J2SE能否装在同一台WIN2000上?
- JDialog的简单问题
- 初学,写了个java的约瑟夫环,请大家给点意见!谢谢!!
A="123"
B="AB"
那么C="32AB1"算不算一种的
private static void perm(String prefix, String s) {
int N = s.length();
if (N == 0) System.out.println(prefix);
else {
for (int i = 0; i < N; i++)
perm(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, N));
} } private static void swap(char[] a, int i, int j) {
char c;
c = a[i]; a[i] = a[j]; a[j] = c;
} private static String builder(char c, int i){
StringBuilder sb = new StringBuilder();
for(int j = 0; j< i; j++)
sb.append(c);
return sb.toString();
}
public static void main(String[] args) {
char A,B;
int M,N;
A = 'a';
B = 'b';
M = 2;
N = 3;
String aString = builder(A,M);
String bString = builder(B,N);
perm(aString + bString);
}
}哈,作业没写完来玩这个。
int n=4;
String A="A";// 0
String B="B";// 1
for(int i=0;i<Math.pow(2,m+n);i++){
String str = Integer.toBinaryString(i);
if(str.replaceAll("0", "").length()==n){
str=str.replaceAll("0", "A").replaceAll("1", "B");
for(int j=str.length();j<m+n;j++)
str="A"+str;
System.out.println(str);
}
}
int add = 1;
for (int i = 1; i <= (m + n); i++)
add = add * 2;
return add;
} private static int[] covert(int m, int n, int a) {// 把a转为2进制
int AB[] = new int[m + n];
int aa = a;
for (int i = 1; i <= m + n; i++) {
a = aa % 2;
if (aa != 1) {
if (a != 0)
AB[i - 1] = 1;
else
AB[i - 1] = 0;
}
if (aa == 1) {
AB[i - 1] = 1;
break;
}
aa = aa / 2;
}
return AB;
} public static void main(String[] args) {
int m = 3, n = 2, a;// m表示M个A,n表示N个B;
a = get(m, n);
for (int j = 0; j < a; j++) {
int AB[] = new int[m + n];
int mn = 0;
AB = covert(m, n, j);
for (int i = 0; i < m + n; i++) {
mn = mn + AB[i];
}
if (mn == m) {
StringBuffer s = new StringBuffer();
for (int i = 0; i < m + n; i++) {
if (AB[i] == 1)
s.append('A');
else
s.append('B');
}
System.out.println(s.toString());
} }
}
}
用最简单的方法写了个,m表示M个A,n表示N个B;
无重复写的很丑陋高手表扔砖啊
没有问题请结帖。呵呵。
用SET可以实现,但估计初学者不懂比如我
但愿楼主能看的明白...
shan1119(大天使,卐~解!) 的方法虽然简单...但是m,n值一大就不行了...注意,以下方法能运行,结果也正确,就是写的有点乱...应该还能再简化import java.util.*;public class Test {
public static long countNum = 0;
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
int n = 5;
int m = 14;
Test t = new Test(m,n);
int[] a = {n};
t.array[1].add(a);
t.split(a);
for(int k=1; k<=n; k++) {
boolean[] ab = new boolean[m+1];
for(int i=0; i<k; i++) {
ab[i] = true;
}
t.choice(ab, k);
}
System.out.println(countNum);
Long endTime = System.currentTimeMillis();
System.out.println("Totle time is " + (endTime - startTime) + " milliseconds"); }
public static void print(boolean[] ab) {
for(int i=0; i<ab.length; i++) {
if(ab[i] == true)
System.out.print("1 ");
else
System.out.print("0 ");
}
}
public Test(int m, int n) {
array = new ArrayList[n+1];
for(int i=0; i<n+1; i++) {
array[i] = new ArrayList();
}
}
private ArrayList[] array;
public void split(int[] a) {
int last = a[a.length-1];
if(last!=1) {
for(int i=1; i<last; i++) {
int[] aSplit = new int[a.length+1];
System.arraycopy(a, 0, aSplit, 0, a.length-1);
aSplit[a.length-1] = last-i;
aSplit[a.length] = i;
array[a.length+1].add(aSplit);
split(aSplit);
}
}
}
public void choice(boolean[] ab, int num) {
do {
for(int i=0; i<array[num].size(); i++) {
int[] ai = (int[])array[num].get(i);
int n = 0;
for(int j=0; j<ab.length; j++) {
if(ab[j] != false) {
print(ai[n]);
n++;
}
if(j != ab.length-1) System.out.print("A");
}
System.out.println();
countNum++;
}
} while(this.has1to0Change(ab));
}
public void print(int n) {
for(int i=0; i<n; i++) {
System.out.print("B");
}
}
public boolean has1to0Change(boolean[] ab) {
boolean result = false;
int count = 0;
boolean privious = false;
for(int i=0; i<ab.length; i++) {
boolean current = ab[i];
if((current == false) && (privious == true)) {
result = true;
ab[i] = true;
for(int k=0; k<i; k++) {
if(k < count-1) ab[k] = true;
else ab[k] = false;
}
break;
}
privious = current;
if(current == true) count++;
}
return result;
}
}
result:
11628
Totle time is 1442 milliseconds
N次方和转换到二进制原来有函数可用的
思路是一致的。
就是A=1,B=0;
那么先求出M+N位的(0,1)全排列,然后把这些位置上的0,1相加,如果等于M,那么就是我们要的字符串。
原来有人跟我说可以用二叉树实现思路我想也差不多,都要判断有几个A的。
m,n中较小的去初始化
int[] a = {n};
较大的去构造boolean数组
还有人和我一样无聊的啊
一看就知道我是初学者的了,表抢分,哈哈。。
public static long countNum = 0;
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
int n = 5;
int m = 14;
Test t = new Test(m,n);
int[] a = {n};
t.array[1].add(a);
t.split(a);
String[][][] s1 = new String[n+1][][];
for(int i=1; i<=n; i++) {
int length = t.array[i].size();
s1[i] = new String[length][];
for(int j=0; j<length; j++) {
int[] ai = (int[])t.array[i].get(j);
s1[i][j] = new String[i];
for(int k=0; k<i; k++) {
StringBuilder sb = new StringBuilder("");
for(int p=0; p<ai[k]; p++)
sb.append('A');
s1[i][j][k] = sb.toString();
}
}
}
for(int i=1; i<=n; i++) {
for(int j=0; j<s1[i].length; j++) {
for(int k=0; k<s1[i][j].length; k++) {
System.out.print(s1[i][j][k] + ",");
}
System.out.println();
}
}
/* for(int i=1; i<=n; i++) {
for(int j=0; j<t.array[i].size(); j++) {
int[] ai = (int[])t.array[i].get(j);
for(int k=0; k<ai.length; k++) {
System.out.print(ai[k] + ",");
}
System.out.println();
}
}*/
for(int k=1; k<=n; k++) {
int[] ab = new int[m+1];
for(int i=0; i<k; i++) {
ab[i] = 1;
}
t.choice(ab, k, s1);
}
System.out.println(countNum);
Long endTime = System.currentTimeMillis();
System.out.println("Totle time is " + (endTime - startTime) + " milliseconds"); }
public Test(int m, int n) {
array = new ArrayList[n+1];
for(int i=0; i<n+1; i++) {
array[i] = new ArrayList();
}
s = new StringBuilder("");
for(int i=0; i<m; i++)
s.append('B');
}
private ArrayList[] array;
private StringBuilder s;
public void split(int[] a) {
int last = a[a.length-1];
if(last!=1) {
for(int i=1; i<last; i++) {
int[] aSplit = new int[a.length+1];
System.arraycopy(a, 0, aSplit, 0, a.length-1);
aSplit[a.length-1] = last-i;
aSplit[a.length] = i;
array[a.length+1].add(aSplit);
split(aSplit);
}
}
}
public void choice(int[] ab, int num, String[][][] s1) {
do {
int[] ai = new int[num];
int count = 0;
for(int i=0; i<ab.length; i++) {
if(ab[i] == 1) {
ai[count] = i;
//System.out.print(ai[count] + ",");
count++;
}
}
//System.out.println();
for(int j=0; j<s1[num].length; j++) {
StringBuilder sb = new StringBuilder(s);
for(int i=0; i<ai.length; i++) {
sb.insert(ai[i], s1[num][j][i]);
}
System.out.println(sb);
countNum++;
}
} while(this.has1to0Change(ab));
}
public boolean has1to0Change(int[] ab) {
boolean result = false;
int count = 0;
int privious = 0;
for(int i=0; i<ab.length; i++) {
int current = ab[i];
if((current == 0) && (privious == 1)) {
result = true;
ab[i] = 1;
for(int k=0; k<i; k++) {
if(k < count-1) ab[k] = 1;
else ab[k] = 0;
}
break;
}
privious = current;
if(current == 1) count++;
}
return result;
}
}11628
Totle time is 219 milliseconds