developYan 2022-08-01 00:51 采纳率: 100%
浏览 84
已结题

动态行列排列组合实现

动态行列排列组合实现,算法可以尝试下
问题如图

img

代码如下

public static void main(String[] args) {
List aStrings = Arrays.asList("1");
List bStrings = Arrays.asList("2","3");
List cStrings = Arrays.asList("4","5", "6");

    /**
     * 动态行列排列组合题
     * 组合中间用_链接,打印最终组合List<String>,算法中不要出现固定行数和列数限制,结果如下(换行忽略)
     * 1_2, 1_3, 1_4, 1_5, 1_6,
     * 2_4, 2_5, 2_6,
     * 3_4, 3_5, 3_6,
     * 1_2_4, 1_2_5, 1_2_6,
     * 1_3_4, 1_3_5, 1_3_6
     */

}
  • 写回答

4条回答 默认 最新

  • miaoch 2022-08-01 11:44
    关注
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
    
        public static void main(String[] args) {
            String[][] datas = new String[][]{
                    new String[]{"1"},
                    new String[]{"2", "3"},
                    new String[]{"4", "5", "6"}
            };
            List<String> result = new ArrayList<>();
            dfs(datas, 0, "", result);
            System.out.println(result);
            result.sort((o1, o2) -> {
                int o1c = strCount(o1, '_');
                int o2c = strCount(o2, '_');
                if (o1c == o2c) {
                    return o1.compareTo(o2);
                } else {
                    return o1c - o2c;
                }
            });
            System.out.println(result);
        }
    
        public static int strCount(String source, char c) {
            int ans = 0;
            for (char sc : source.toCharArray()) {
                if (sc == c) {
                    ans += 1;
                }
            }
            return ans;
        }
    
        public static void dfs(String[][] datas, int line, String prefix, List<String> result) {
            if (line >= datas.length) {
                return;
            }
            // 将这行加入结果集
            for (String str : datas[line]) {
                if ("".equals(prefix)) {
                    dfs(datas, line + 1, str, result);
                } else {
                    String newStr = prefix + "_" + str;
                    result.add(newStr);
                    dfs(datas, line + 1, newStr, result);
                }
            }
            // 抛弃这行
            dfs(datas, line + 1, prefix, result);
        }
    }
    
    

    用的是dfs,
    你给的样例打印顺序挺不合理的,看起来顺序是按照个数排序,但是遍历1开头2个结束后,再重新遍历1开头3个感觉是冗余的操作。所以我只能重新写了一个排序。但是我这个排序只是随便写写不作数的,还是需要你把问题补充完整

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月10日
  • 已采纳回答 8月2日
  • 请采纳用户回复 8月1日
  • 创建了问题 8月1日

悬赏问题

  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码