黑马程序员技术交流社区

标题: 一道华为上机题 [打印本页]

作者: ciying88    时间: 2017-3-15 21:35
标题: 一道华为上机题
有一个字符串,根据输入参数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;
}

作者: a469517790    时间: 2017-3-15 21:52
这递归调用的。。。。。
作者: 明明凯凯归归    时间: 2017-3-15 23:53
很好,学习了
作者: 豆子先生    时间: 2017-3-16 00:34
收藏了,学到后面再看

作者: 陈大仙…    时间: 2017-3-16 08:23
这题不错哦
作者: lvshen9    时间: 2017-3-16 08:27
可以用数学的排列组合

作者: lvshen9    时间: 2017-3-16 08:29
就是字符串长度的阶乘除以m的阶乘





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2