用Java实现字符数组的所有组合?

一天十小时 2008-12-15 07:37:05
比如:
char a={'A','B','C'},要求输出结果为:
A,B,C,AB,AC,BC,ABC

注:AB和BA属于同一个,对顺序无要求.

希望大家帮帮忙想一下,我想了好久想不出来,如果大家用递归,最好能够讲一下,因为俺对递归反应很迟钝,谢谢!
...全文
780 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuwen9 2008-12-20
  • 打赏
  • 举报
回复
学习啦!
3Q
Miracle1216 2008-12-19
  • 打赏
  • 举报
回复
递归确实很扰人,我操他妈!
Miracle1216 2008-12-19
  • 打赏
  • 举报
回复
靠,楼上的程序好牛逼啊,刚开始还以为看懂了,调试了一遍才真正搞懂了,不能眼高手低啊!牛逼楼上!
一天十小时 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bobskay 的回复:]
引用 3 楼 evilmars 的回复:
Java code
void combine(String str){
int length=str.length();
char[] in=str.toCharArray();
StringBuffer out=new StringBuffer();

allCombine(in,out,length,0,0);
}
void allCombine(char[] in,StringBuffer out,int length,int sign,int start){
for(int i=start;i <length;i++){
out.append(in[i]); …
[/Quote]
我也是很久不明白,递归的原理好像已经明白了,可是用起来就是反应不过来,哎...
bobskay 2008-12-19
  • 打赏
  • 举报
回复
补充一下,其实length这个字段也可以不用传的.

void combine(String str) {
char[] in = str.toCharArray();
StringBuffer out = new StringBuffer();
allCombine(in, out, 0);
}

void allCombine(char[] in, StringBuffer out, int start) {
for (int i = start; i < in.length; i++) {
out.append(in[i]);
System.out.println(out);
if (i < in.length - 1) {
allCombine(in, out, i + 1);
}
out.setLength(out.length() - 1);
}
}

这样楼主能更好理解了
bobskay 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 evilmars 的回复:]
Java code
void combine(String str){
int length=str.length();
char[] in=str.toCharArray();
StringBuffer out=new StringBuffer();

allCombine(in,out,length,0,0);
}
void allCombine(char[] in,StringBuffer out,int length,int sign,int start){
for(int i=start;i<length;i++){
out.append(in[i]);
System.out.println(out);

[/Quote]
这个强,看了好久才明白,不过sign是废字段功能和start一样.不知道evilmars弄这个字段干嘛
一天十小时 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 evilmars 的回复:]
Java code
void combine(String str){
int length=str.length();
char[] in=str.toCharArray();
StringBuffer out=new StringBuffer();

allCombine(in,out,length,0,0);
}
void allCombine(char[] in,StringBuffer out,int length,int sign,int start){
for(int i=start;i<length;i++){
out.append(in[i]);
System.out.println(out);

[/Quote]
参数int sign有什么用?
cwjieNo1 2008-12-19
  • 打赏
  • 举报
回复
谁能解释一个out.setLength(out.length()-1)到底是实现什么功能啊
我知道是把out清空,然后再重新开始,但是还是有点转不过弯来~
ccc_moriya 2008-12-19
  • 打赏
  • 举报
回复
三楼的方法没排全啊。。。
import java.util.*;
import java.io.*;
public class TestT{
public static void main(String[] args)throws Exception{
String [] array=new String[]{"A","B","C","D"};
listAll(Arrays.asList(array),"");

}

public static void listAll(List candidate,String prefix){
System.out.println(prefix);
for(int i=0;i<candidate.size();i++){
List temp =new LinkedList(candidate);
listAll(temp,prefix+temp.remove(i));
}
}
}
phoenixLotus 2008-12-19
  • 打赏
  • 举报
回复
学习下!
一天十小时 2008-12-19
  • 打赏
  • 举报
回复
还是看不明白啊,哪位帮讲解一下????
evilmars 2008-12-16
  • 打赏
  • 举报
回复

void combine(String str){
int length=str.length();
char[] in=str.toCharArray();
StringBuffer out=new StringBuffer();

allCombine(in,out,length,0,0);
}
void allCombine(char[] in,StringBuffer out,int length,int sign,int start){
for(int i=start;i<length;i++){
out.append(in[i]);
System.out.println(out);
if(i<length-1){
allCombine(in,out,length,sign+1,i+1);
}
out.setLength(out.length()-1);
}
}

向输出字符串中的当前位置添加一个字符
剩下的字符继续这样操作
一天十小时 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jcyan 的回复:]
论坛里有很多,自己搜下吧
[/Quote]
怎么搜?
在百度没搜着,如果CSDN有的话百度应该可以搜到
jcyan 2008-12-15
  • 打赏
  • 举报
回复
论坛里有很多,自己搜下吧
Java题目(仅供学习): 一、根据以下要求,比较两个字符串的大小,并返回比较结果: 1、比较两字符串的大小。 2、忽视大小写 3、 按字典序 如果第一个字符串大于第二个字符串 返回大于0,如果第一个字符串等于第二个字符串 返回等于0 ,如果第一个字符串小于第二个字符串返回小于0。 4、例子 compareToIgnoreCase("HARD","hark")的比较结果返回小于0 。 二、给一个二维数组inArr[ ][ ],写一个方法获取每一列的最小值,输出到一个一维数组outArr[ ]中。 如:inArr[ ][ ]={{1,8,3},{6,5}},则输出outArr[ ] = {1,5,3} 三、判断一个字符串是否是首字母大写,其余字母都是小写。 例如 输入:True 输出: true 四、输入一个字符串,字符串是字母和数字的组合,编程实现输出一个新的字符串,要求字母在前面,数字在后面,顺序不变,例如:2s7ess83a 变成sessa2783 五、一个字符串,获取最长的一个单词,如有多个相同长度的单词返回第一个单词。入输入:"hello china"则返回 hello 六、将一个字符里出现最多的字母截取,如,addcbbs变为acs。 七、输入一个整型数组,arr=(1,2,5) 输出数组中数字对应英文字母表中对应的字母,如果不在字母表中用"?"表示 例如,输入arr=(1,2,30,3),输出:a b ? c 八、输入一数组,按照英文26个字母顺序,输出每个数字对应的字母,如果查不到,则输出?。如[1,3,30],输出ac?。 九、把数组中的1-26的数字映射成a-z的小写字母 如果输入其他数字,则在页面上打印"?" 如:int [] arr={1,2,3,4,30} 输出:a,b,c,d,? 十、输入A-Z26个字母,输入一个大写字母后,输出该字母之后第5个字母的小写。 如输入A,输出f,输入Z,则输出e,超出Z是,超过1个,则返回a,超过两个,则返回b,以此类推。 十一、一个维数组,求大于等于数组内的所有值的平均值的个数 例,{1、2、3、4、5、6、7、8、9、10} 输出 5 十二、给一个二维数组inArr[ ][ ],写一个方法获取每一列的最大值,输出到一个一维数组outArr[ ]中。 如:inArr[ ][ ]={{1,8,3},{6,5}},则输出outArr[ ] = {8,6} 选取一组一维数组,求出它的最大值和次大值,放入另一个一维数组中并返回。 十三、求两个数的最大公约数

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧