JAVA 请递归高手写个程序

秋雨 发布于 2013/05/03 11:27
阅读 1K+
收藏 2

请递归高手写个程序:

传入一个字符串“Z|SY|K|DM” ,该字符串以“|”分隔,递归结果应该是:

return : "ZSKD,ZSKM,ZYKD,ZYKM";

假如传入的字符串是:“Y|KG|S|D”,递归结果应该是:

return : "YKSD,YGSD";


加载中
0
sunyzc
sunyzc

递归实现:

public static void removeLetter(String[] strArray) {
	boolean flag = true;
	for (int i = 0; i < strArray.length; i++) {
		String tmpStr = strArray[i];
		if (tmpStr.length() > 1) {
			for (int j = 0; j < tmpStr.length(); j++) {
				strArray[i] = tmpStr.substring(0, j) + tmpStr.substring(j + 1, tmpStr.length());
				removeLetter(strArray);
				strArray[i] = tmpStr;
			}
			flag = false;
		}
	}
	if (flag) {
		for (String s : strArray)
			System.out.print(s);
		System.out.print(",");
	}
}

public static void main(String[] args) {
	removeLetter("Z|SY|K|DM".split("[|]"));
}

0
lzsCommunity
lzsCommunity
利用String的splite方法分割字符串,然后组合就行了
戴威
戴威
回复 @throwable : 的确是96个
excepiton
excepiton
回复 @秋雨 : 96个,right?
秋雨
秋雨
“GK|SDNX|OPQD|AWQ” 你试试用splite分割再组合看看有几种组合情况?
0
fhp0917
fhp0917
用不着递归吧
秋雨
秋雨
不用递归,那兄台有何高见,说说看啊
0
excepiton
excepiton
自己写了一下,这个算法不复杂,应该是大学C语言课程的课程作业之类的题目
0
书一
书一
看起来可以用树构造出来、
0
fneg
fneg

引用来自“廖凯”的答案

看起来可以用树构造出来、
+1 || 之间的都是兄弟节点,构造成树以后,用先序遍历,后序遍历
0
jingshishengxu
jingshishengxu

测试通过   

public static void main(String[] args) {

        // TODO Auto-generated method stub 
        String ss="Z|SY|K|DM"; 
        String[] sss=ss.split("[|]"); 
        StringBuilder r=new StringBuilder(); 
        String s=sss[0]; 
        for(int i=0;i<s.length();++i) 
        { 
            r.append(linkstr(""+s.charAt(i),sss,1)); 
        } 
        r.setLength(r.length()-1); 
        System.out.print(r); 
    } 
    static public String linkstr(String head,String[] sss,int index) 
    { 
        String result=""; 
        if (index>=sss.length) 
        { 
            return head+","; 
        } 
        String s=sss[index]; 
        for(int i=0;i<s.length();++i) 
        { 
            result+=linkstr(head+s.charAt(i),sss,index+1); 
        } 
        return result; 
    }

0
戴威
戴威
看不出来和递归有一毛钱的关系。
0
秋雨
秋雨

引用来自“jingshishengxu”的答案

测试通过   

public static void main(String[] args) {

        // TODO Auto-generated method stub
        String ss="Z|SY|K|DM";
        String[] sss=ss.split("[|]");
        StringBuilder r=new StringBuilder();
        String s=sss[0];
        for(int i=0;i<s.length();++i)
        {
            r.append(linkstr(""+s.charAt(i),sss,1));
        }
        r.setLength(r.length()-1);
        System.out.print(r);
    }
    static public String linkstr(String head,String[] sss,int index)
    {
        String result="";
        if (index>=sss.length)
        {
            return head+",";
        }
        String s=sss[index];
        for(int i=0;i<s.length();++i)
        {
            result+=linkstr(head+s.charAt(i),sss,index+1);
        }
        return result;
    }
呵呵,这才是我想要的答案,真心谢谢哈...
戴威
戴威
回复 @jingshishengxu : 的确是循环嵌套就能搞定的问题……
秋雨
秋雨
有道理,现在像你这样的人少啊
jingshishengxu
jingshishengxu
实干兴邦,空谈误程序员,把程序写出来是王道;我觉得这是一个不定深度的for循环嵌套问题
0
戴威
戴威
public static String doSomeThing(String s) {
	String[] parts = s.split("[|]");
	int length = parts.length;
	char[][] ctx = new char[length][];
	int[] indexes = new int[length];
	for (int i = 0; i < length; i++) {
		ctx[i] = parts[i].toCharArray();
		indexes[i] = 0;
	}
	
	StringBuilder result = new StringBuilder();
	int index;
	do {
		for (int i = 0; i < length; i++) {
			if (ctx[i].length > 0) {
				result.append(ctx[i][indexes[i]]);
			}
		}
		for (index = length - 1; index >= 0; index--) {
			if (indexes[index] < ctx[index].length - 1) {
				indexes[index]++;
				for (int i = index + 1; i < length; i++) {
					indexes[i] = 0;
				}
				break;
			}
		}
		result.append(',');
	} while(index >= 0);
	if (result.length() > 0) {
		result.deleteCharAt(result.length() - 1);
	}
	return result.toString();
}

public static void main(String[] args) {
	System.out.println(doSomeThing("Z|SY|K|DM"));
	System.out.println(doSomeThing("Y|KG|S|D"));
}

循环也可以很轻松的搞定嘛

返回顶部
顶部