A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ciying88 中级黑马   /  2017-3-15 21:35  /  1182 人查看  /  6 人回复  /   3 人收藏 转载请遵从CC协议 禁止商业使用本文

有一个字符串,根据输入参数m,找出字符串的m个字符的所有字符串

String str ="abc", m=2  得到结果是 "ab" "ac" "bc"
String str ="abcd" , m=3 得到结果是"abc" "acd" "bcd" "abd"





code:

/**
* 分治思想
*
* @param target
* @param num
* @return
*/
public static List<String> choose(String target, int num) {

        List<String> resultList = new LinkedList<>();

        if (num > target.length()) {
                return resultList;
        }
        if (num == target.length()) {
                resultList.add(target);
                return resultList;
        }
        // 将target均分(0 ~ bound - 1与bound ~ end)
        int bound = target.length() / 2;
        String left = target.substring(0, bound);
        String right = target.substring(bound, target.length());
        // 要选择的num个元素可能全部来自left
        resultList.addAll(choose(left, num));
        // 可能全部来自right
        resultList.addAll(choose(right, num));
        // 可能两边都有,这时对num做划分:num = l + r(l表示来自left的元素的个数,r表示来自right的元素的个数)
        for (int l = 1; l < num; l++) {
                int r = num - l;
                // 从left中挑选l个元素
                List<String> fromLeftList = choose(left, l);
                // 从right中挑选r个元素
                List<String> fromRightList = choose(right, r);
                // 组合起来
                for (String fromLeft : fromLeftList) {
                        for (String fromRight : fromRightList) {
                                // 添加到结果集里面
                                resultList.add(fromLeft + fromRight);
                        }
                }
        }
        return resultList;
}

6 个回复

倒序浏览
这递归调用的。。。。。
回复 使用道具 举报
很好,学习了
回复 使用道具 举报
收藏了,学到后面再看
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
这题不错哦
回复 使用道具 举报
可以用数学的排列组合
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
就是字符串长度的阶乘除以m的阶乘
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马