java算法 排列组合

痴人了个说梦 2014-05-07 12:23:03
最近要做一个根据拼音首字母检索数据的功能,但是有的汉字是多音字,导致一个汉字对应多个首字母。比如重阳就是 zhong yang 和chong yang,对应的首字母分别是z y 和 c y 。这两个排列组合都要得到。所以问题就是, 比如 [a,b,c],[b],[f],[f,d] 这种数据格式,怎么排列成为 : abff, abfd, bbff,bbfd,cbff,fbfd这种排列组合;顺序不能变。各位大侠。求算法。。。。。。
...全文
397 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
WayneXuan 2014-05-10
  • 打赏
  • 举报
回复
引用 6 楼 u010323589 的回复:
谢了.大牛....
不敢,小虾而已,互相学习 这个类完善一下应该是这样:

import java.util.Arrays;

public class ArrayIndex {
	private int length;
	private int[] lengths;
	private int[] indexs;
	public ArrayIndex(int[] limits) {
		length=limits.length;
		lengths=Arrays.copyOf(limits,length);
		indexs=new int[length];
	}
	public int[] get() {
		return Arrays.copyOf(indexs,length);
	}
	public boolean set(int[] indexs) {
		if (length!=indexs.length) {
			return false;
		}
		for (int i=0; i<length; i++) {
			if (indexs[i]>=lengths[i]||indexs[i]<0) {
				return false;
			}
		}
		for (int i=0; i<length; i++) {
			this.indexs[i]=indexs[i];
		}
		return true;
	}
	public int[] next() {
		for (int i=0; i<length; i++) {
			if (++indexs[i]<lengths[i]) {
				return Arrays.copyOf(indexs,length);
			}
			indexs[i]=0;
		}
		return null;
	}
	public int[] prev() {
		for (int i=0; i<length; i++) {
			if (--indexs[i]>=0) {
				return Arrays.copyOf(indexs,length);
			}
			indexs[i]=lengths[i]-1;
		}
		return null;
	}
	public void reset() {
		for (int i=0; i<length; i++) {
			indexs[i]=0;
		}
	}
	@Override
	public String toString() {
		return "ArrayIndex [limits="+Arrays.toString(lengths)+", indexs="+Arrays.toString(indexs)+"]";
	}
	@Override
	public int hashCode() {
		final int prime=31;
		int result=1;
		result=prime*result+Arrays.hashCode(indexs);
		result=prime*result+Arrays.hashCode(lengths);
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this==obj) {
			return true;
		}
		if (obj==null) {
			return false;
		}
		if (getClass()!=obj.getClass()) {
			return false;
		}
		ArrayIndex other=(ArrayIndex)obj;
		if (length!=other.length) {
			return false;
		}
		if (!Arrays.equals(indexs,other.indexs)) {
			return false;
		}
		if (!Arrays.equals(lengths,other.lengths)) {
			return false;
		}
		return true;
	}
}
痴人了个说梦 2014-05-10
  • 打赏
  • 举报
回复
引用 4 楼 waynexuan 的回复:
按照人的思维列举,我是这样做的

import java.util.ArrayList;
import java.util.Arrays;

class ArrayIndex {
	private int index;
	private int[] limits;
	private int[] indexs;
	public ArrayIndex(int[] limits) {
		this.limits=limits;
		indexs=new int[limits.length];
	}
	public int[] get() {
		return indexs;
	}
	public int[] next() {
		for (int i=index; i<indexs.length; i++) {
			if (++indexs[i]<limits[i]) {
				return indexs;
			}
			indexs[i]=0;
		}
		return null;
	}
}

class Test {
	public static void main(String[] args) {
		char[][] params=new char[][]{{'a','b','c'},{'b'},{'f'},{'f','d'}};
		String[] rs=getPermutations(params);
		for (String r : rs) {
			System.out.println(r);
		}
	}
	public static String[] getPermutations(char[][] params) {
		StringBuffer buffer=new StringBuffer();
		ArrayList<String> list=new ArrayList<String>();
		int[] lengths=new int[params.length];
		for (int i=0; i<params.length; i++) {
			lengths[i]=params[i].length;
		}
		ArrayIndex arrayIndex=new ArrayIndex(lengths);
		int[] indexs=arrayIndex.get();
		do {
			buffer.setLength(0);
			for (int i=0; i<params.length; i++) {
				buffer.append(params[i][indexs[i]]);
			}
			list.add(buffer.toString());
			indexs=arrayIndex.next();
		} while (indexs!=null);
		return list.toArray(new String[list.size()]);
	}
}
谢了.大牛....
痴人了个说梦 2014-05-10
  • 打赏
  • 举报
回复
引用 3 楼 zuoziji_lj 的回复:
4个字母为一个组合,字母顺序不能变,但可以重复,列出所有的组合?是这意思吗?
是这个意思.求算法.....
WayneXuan 2014-05-10
  • 打赏
  • 举报
回复
按照人的思维列举,我是这样做的

import java.util.ArrayList;
import java.util.Arrays;

class ArrayIndex {
	private int index;
	private int[] limits;
	private int[] indexs;
	public ArrayIndex(int[] limits) {
		this.limits=limits;
		indexs=new int[limits.length];
	}
	public int[] get() {
		return indexs;
	}
	public int[] next() {
		for (int i=index; i<indexs.length; i++) {
			if (++indexs[i]<limits[i]) {
				return indexs;
			}
			indexs[i]=0;
		}
		return null;
	}
}

class Test {
	public static void main(String[] args) {
		char[][] params=new char[][]{{'a','b','c'},{'b'},{'f'},{'f','d'}};
		String[] rs=getPermutations(params);
		for (String r : rs) {
			System.out.println(r);
		}
	}
	public static String[] getPermutations(char[][] params) {
		StringBuffer buffer=new StringBuffer();
		ArrayList<String> list=new ArrayList<String>();
		int[] lengths=new int[params.length];
		for (int i=0; i<params.length; i++) {
			lengths[i]=params[i].length;
		}
		ArrayIndex arrayIndex=new ArrayIndex(lengths);
		int[] indexs=arrayIndex.get();
		do {
			buffer.setLength(0);
			for (int i=0; i<params.length; i++) {
				buffer.append(params[i][indexs[i]]);
			}
			list.add(buffer.toString());
			indexs=arrayIndex.next();
		} while (indexs!=null);
		return list.toArray(new String[list.size()]);
	}
}
卡卡吉利 2014-05-08
  • 打赏
  • 举报
回复
4个字母为一个组合,字母顺序不能变,但可以重复,列出所有的组合?是这意思吗?
初夏雨夜 2014-05-07
  • 打赏
  • 举报
回复
你才开始学编程啊?
痴人了个说梦 2014-05-07
  • 打赏
  • 举报
回复
引用 1 楼 curly361907587 的回复:
你才开始学编程啊?
不是.但是这个算法不会,

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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