您的位置:首页 > 编程语言 > Java开发

【每天算法3】:用java语言实现,二维Vector的排序组合

2010-03-25 14:02 375 查看
题目:

有一个二维Vector,每个元都是字符串(或者其他对象),如下面这个三行,每行元素不固定的二维Vector V。


A、B、C、D

H、I、J、K、M

X、Y、Z

求出满足以下条件的所有Vector D(一定是所有可能的情况):

1.此Vector D的元素包含V的所有元素,且每个元素仅出现一次

2.
此Vector
D中包含在V[1]中的元素之间的顺序不能发生改变,即A、B、C、D之间的顺序不发生改变,同理,V[2]、V[3]。都不发生改变。对于本例,也就是
说,在结果D中,A、B、C、D的先后顺序不变,H、I、J、K、M的先后顺序不变,X、Y、Z的先后顺序不变。结果D的几种可能的情况是:

1:A、B、C、D、H、I、J、K、M、X、Y、Z

2:H、I、A、B、C、X、D、J、K、Y、Z、M

3:A、H、I、X、Y、Z、B、C、J、K、M、D等等





package com.sw.suanfa.first.ten;
import java.util.Vector;
/**
 * 有一个二维Vector,每个元都是字符串(或者其他对象),如下面这个三行,每行元素不固定的二维Vector  V。
                      A、B、C、D
                      H、I、J、K、M
                      X、Y、Z
      求出满足以下条件的所有Vector D(一定是所有可能的情况):
1.此Vector D的元素包含V的所有元素,且每个元素仅出现一次
2. 此Vector D中包含在V[1]中的元素之间的顺序不能发生改变,即A、B、C、D之间的顺序不发生改变,同理,V[2]、V[3]。都不发生改变。对于本例,也就是说,在结果D中,A、B、C、D的先后顺序不变,H、I、J、K、M的先后顺序不变,X、Y、Z的先后顺序不变。结果D的几种可能的情况是:
            1:A、B、C、D、H、I、J、K、M、X、Y、Z
            2:H、I、A、B、C、X、D、J、K、Y、Z、M
            3:A、H、I、X、Y、Z、B、C、J、K、M、D等等
            
 * @author songwei
 *解决方案:递归中方法:首先找出下一个位置能出现的字符。
 *比如第一次为A,H,X可以出现在第一个位置。
 *则对其进行循环。
 *当取第一个为A的时候,游标数组表示为[1,0,0]。意思为,第一个childV下次取值位置为第二个位置。然后进入下一个取值,
 *		下一次取值为范围根据游标可得为B,H,X。循环,当取B时,游标数组表示为[2,0,0]。可以保证一个childV中的数值顺序不会乱掉。
 *........依此进行循环递归即可。
 *我这里没有考虑childV中自身有重复,比如A、B、C、D、B、C、D
 *以及两个childV中存在重复[A、B、C、D]    [H、I、A、B、C、D、J、K、M]
 *感觉有点复杂了!谁能更好的处理,请给我个代码哈。
 */
public class ComposeVector {
	
	private static Vector<Vector<String>> parentV = new Vector<Vector<String>>();
	public static void main(String[] args) {
		
		Vector<String> childV1 = new Vector<String>();
		childV1.add("A");
		childV1.add("B");
//		childV1.add("C");
//		childV1.add("D");		
		Vector<String> childV2 = new Vector<String>();
		childV2.add("H");
//		childV2.add("B");
		childV2.add("I");
//		childV2.add("J");
//		childV2.add("K");
		
		Vector<String> childV3 = new Vector<String>();
		childV3.add("X");
		childV3.add("Y");
//		childV3.add("Z");
		
		parentV.add(childV1);
		parentV.add(childV2);
		parentV.add(childV3);
		
		int[] cursor = new int[parentV.size()];
		getNextString(cursor,new Vector<String>());
	}
	
	/**
	 * 
	 * @param cursor 游标序列。其中数组下标表示parentV中的各个childV的序号,数组值对应该childV中被取值的位置。
	 * @param currentVector 当前序列
	 * 
	 */
	public static void getNextString(int[] cursor,Vector<String> vector){
		Vector<String> next = new Vector<String>();
		int nullNum = 0;
		for(int i=0;i<parentV.size();i++){
			Vector<String> tmp = parentV.get(i);
			int cursorTmp = cursor[i] ;
			if(tmp.size()<=cursorTmp){
				next.add(null);//用null来区分。
				nullNum ++ ;
			}else{
				next.add(tmp.get(cursorTmp));
			}
		}
		if(next.size() == nullNum){
			outVector(vector);
			return ;
		}
		for(int j=0;j<next.size();j++){
			String nextVectorStr = next.get(j);
			if(nextVectorStr == null) continue ;
			//对currentVector和游标数组进行clone后,再进行操作,以免影响下次循环的传值。
			Vector<String> currentVector = (Vector<String>)vector.clone();
			int[] currentCursor = cursor.clone();
			currentVector.add(nextVectorStr);
			int cu = currentCursor[j];
			currentCursor[j] = cu+1 ;//将该字符所在的Vector的游标+1
			getNextString(currentCursor, currentVector);
		}
		
	}
	
	/**
	 * 打印Vector
	 * @param v 需打印的Vector
	 */
	public static void outVector(Vector<String> v){
		for(String t:v){
			System.out.print(t);
			System.out.print(" ");
		}
		System.out.println("");
	}
	
}






写的不是很好。写着写着脑子就有点乱了。算了,就先这样吧。



明天的题目:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: