问题如下:char str={'a','b','c','d','e'}分别用1个、2个、3个、4个、5个'*'去不重复的替换字符我想得到类似下面的结果,每种我只列出一两个结果,
但是要将所有情况都列出,请问各位有什么好的实现方法,
具体的示例,谢谢各位高手,分不够再加 :)
...1个
*bcde
a*cde
ab*de
...2个
**cde
a**de
a*c*e
...3个
***de
**c*e
...4个
****e
***d*
...5个
*****
但是要将所有情况都列出,请问各位有什么好的实现方法,
具体的示例,谢谢各位高手,分不够再加 :)
...1个
*bcde
a*cde
ab*de
...2个
**cde
a**de
a*c*e
...3个
***de
**c*e
...4个
****e
***d*
...5个
*****
public static List getCompages(char[] chars,int num,char replace){
if(chars.length==num){
List ret=new ArrayList();
ret.add(String.valueOf(chars));
return ret;
}
if(num==1){
List ret=new ArrayList();
for(int i=0;i<chars.length;i++){
char[] clone=(char[]) chars.clone();
clone[i]=replace;
ret.add(String.valueOf(clone));
}
return ret;
}
List ret=new ArrayList();
//两种情况
//第一个字符为替换符号
char[] c1=new char[chars.length-1];
System.arraycopy(chars,1,c1,0,c1.length);
String s=""+replace;
List list1=getCompages(c1,num-1,replace);
for(int i=0;i<list1.size();i++){
ret.add(s+(String)list1.get(i));
}
//第一个字符不是替换符号
s=""+chars[0];
List list2=getCompages(c1,num,replace);
for(int i=0;i<list2.size();i++){
ret.add(s+(String)list2.get(i));
} return ret;
}
public static List getCompages(char[] chars,int num,char replace){
if(chars.length==num){
List ret=new ArrayList();
char[] cs=new char[chars.length];
Arrays.fill(cs,replace);
ret.add(String.valueOf(cs));
return ret;
}
if(num==1){
List ret=new ArrayList();
for(int i=0;i<chars.length;i++){
char[] clone=(char[]) chars.clone();
clone[i]=replace;
ret.add(String.valueOf(clone));
}
return ret;
}
List ret=new ArrayList();
//两种情况
//第一个字符为替换符号
char[] c1=new char[chars.length-1];
System.arraycopy(chars,1,c1,0,c1.length);
String s=""+replace;
List list1=getCompages(c1,num-1,replace);
for(int i=0;i<list1.size();i++){
ret.add(s+(String)list1.get(i));
}
//第一个字符不是替换符号
s=""+chars[0];
List list2=getCompages(c1,num,replace);
for(int i=0;i<list2.size();i++){
ret.add(s+(String)list2.get(i));
} return ret;
}
char[] ch = new char[N];
for(int i = 0; i < N; i++)
ch[i] = (char) ('a' + i);
for(int i = (int) (Math.pow(2, N)) - 1; i > 0; i--) {
for(int j = 0; j < N; j++) {
if((i >> (N - j - 1) & 1) == 0)
System.out.print(ch[j]);
else
System.out.print('*');
}
System.out.println();
}
这段程序的设计思想是采用“递推”的算法,给定一个初始状态,然后推导出下一个状态,直到全部完成。public class C { private int n;
private String pattern; public C(int n) {
this.n = n;
char[] s = new char[n];
for (int i=0; i<n; i++) s[i] = (char)('a' + i);
pattern = new String(s);
} public int enumerate(int m) {
int r = 0;
// p[] 保存着每个星号的位置
int[] p = new int[m];
// cp 表示下面要调整第几个星号的位置
int cp = m-1;
// 设置每个星号的初始位置
for (int i=0; i<m; i++) p[i] = i; // 根据星号当前的位置组合,得到下一个位置组合
while (cp >= 0) {
if (cp == m-1) {
// 此时输出一个组合
out(p);
r ++;
} if (p[cp] < n-(m-cp)) {
// 如果当前星号还有移动的空间,就移动一个位置
p[cp]++;
// 然后把它后面的星号重新排位
while (cp < m-1) {
p[cp+1] = p[cp] + 1;
cp++;
}
} else {
// 如果当前星号已经没有移动的空间,就尝试移动前一个星号
cp --;
}
}
return r;
} private void out(int[] p) {
char[] a = pattern.toCharArray();
for (int i=0; i<p.length; i++) a[p[i]] = '*';
System.out.println(new String(a));
} public static void main(String[] args) {
int N = 5;
C worker = new C(N);
for (int m=1; m<=N; m++) {
int r = worker.enumerate(m);
System.out.println("-- C (" + N + ", " + m + ") = " + r);
}
}}