跪求不定长二维数组交叉组合算法

sciolist 2011-09-19 05:02:46
比如说 1 代表 "[A,B,C]"。2 代表 “[D,E,F]” 这样的.

当选择了 1 和 2 后,可能出现的结果的集合为:
[AD、AE、AF、BD、BE、BF、CD、CE、CF].

同理,当用户选择 1,2,3,4后有多少中组合的可能性?

求该算法~ 跪求~

下面是我的算法,可是不行,只能循环一次 囧


String[] sz = number.split("");
String[][] twoDemension = new String[sz.length][];
// 构建二维数组
for (int i = 0; i < sz.length; i++) {
ArrayList<String> swap = NumberToCharsSingleton.getInstance().get(new Integer(sz[i]));
String[] tmp = new String[swap.size()];
for (int j = 0; j < tmp.length; j++) {
tmp[j] = swap.get(j);
}
twoDemension[i] = tmp;
}
// 枚举出所有可能的组合并放入数组
instance = new ArrayList<String>();
for (int i = 0; i < twoDemension.length; i++) {
String[] oneDemension = twoDemension[i];// A,B,C
for (String singleStr : oneDemension) {
String finalStr = "";
finalStr = singleStr;
for (int j = i + 1; j < twoDemension.length; j++) {
for (String tmpStr : twoDemension[j]) {
finalStr += tmpStr;
}
}
instance.add(finalStr);
}
}
...全文
428 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sciolist 2011-09-21
  • 打赏
  • 举报
回复
恩,感谢楼上各位的回答~给了我很多提示~

由于考虑到先前的运算量过大,故而采用了 7,9,10楼的建议,反过来实现了~

其他楼层的回答也给了我很多的想法,在此谢谢了~结贴了~
yyfhz 2011-09-20
  • 打赏
  • 举报
回复
这样的枚举工作量实在是大,不如反其道而行之:将号码簿里的每一个人的姓名拼音映射成为键盘数字,然后将这个数字与输入数字进行匹配。
feathersky 2011-09-20
  • 打赏
  • 举报
回复
反过来求
例如把zhangshan 前4个按键取出来 if match then ....

不需要那么多组合
bellbird 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sciolist 的回复:]

我想大家可能没懂我的意思,好吧,我告诉你们我在做什么事情吧~

Android 手机,或者说所有的手机的拨号盘上,除了1和0之外,都代表了A到Z中的3或4个字母。

而我现在做的,就是当用户输入"6284"号码之后,根据每个键映射的那几个英文字母,枚举出所有可能的组合。然后再去匹配电话簿里联系人的名字拼音,以达到智能提示的作用。

就是这样~ 这下很详细了吧~ 求各位不吝赐教~
[/Quote]
回溯,有多少个数组就生成多少层,每一层代表一次按键
fenix124 2011-09-20
  • 打赏
  • 举报
回复
四重循环,楼上某位已经说了,不考虑去重
A[M][N]为双重数组

for(i = 1;i <= M;i++)
for(j = i+1;j <= M;j++)//两个循环选择出两个数组
for(k = 1;k <= length(A[i]);k++)
for(l = 1;l <= length(A[j]);j++) //这两个循环枚举选择出的两个数组的元素
//(A[i][k],A[j][l])为其中一项

如果只计算计数,则只用一重循环即可
sum(a(i)*a(j)) = (sum(a(i))^2-sum(a(i)^2))/2
超级大笨狼 2011-09-20
  • 打赏
  • 举报
回复
用位运算吧.
icessl 2011-09-19
  • 打赏
  • 举报
回复
楼主可以反过来做:
STEP1: 收到若干位数字,假设是 d1 d2 ... dn;
STEP2: For ALL x IN 号码本 DO
STEP2.1 把 x 的每一个汉字的首字母取出,形成串,令它为 y1 y2 .. ym;
STEP2.2 根据键盘上字母到数字的对应关系把 y1 y2 ... ym 变成 z1 z2 ... zm;
STEP2.3 检查 z1 z2 ... zm 是不是 d1 d2 ... dn 的子串;
STEP2.4 若是子串,就放到提示列表,否则就忽略

sciolist 2011-09-19
  • 打赏
  • 举报
回复
我想大家可能没懂我的意思,好吧,我告诉你们我在做什么事情吧~

Android 手机,或者说所有的手机的拨号盘上,除了1和0之外,都代表了A到Z中的3或4个字母。

而我现在做的,就是当用户输入"6284"号码之后,根据每个键映射的那几个英文字母,枚举出所有可能的组合。然后再去匹配电话簿里联系人的名字拼音,以达到智能提示的作用。

就是这样~ 这下很详细了吧~ 求各位不吝赐教~
sciolist 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fengchaokobe 的回复:]

一般来说有几个数组就循环几层,很容易实现。合并后的结果集可用一动态二维数组来存储!
[/Quote]

关键问题是“有几个数组”这个是不定的,可能是三个,可能是四个,也有可能是8个,也可能是一个。
sciolist 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 spirit23k 的回复:]

套上4层循环就好了么
[/Quote]

肿么套?
bullbat 2011-09-19
  • 打赏
  • 举报
回复
如果只是找出有多少中组合的可能性?

用组合原理解决;
如果要找出结果值,枚举(上面两位说的)
SuperFC 2011-09-19
  • 打赏
  • 举报
回复
一般来说有几个数组就循环几层,很容易实现。合并后的结果集可用一动态二维数组来存储!
一名金人 2011-09-19
  • 打赏
  • 举报
回复
套上4层循环就好了么

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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