您的位置:首页 > 其它

算法思维(递归)训练:输出字符串长度为M的子序列

2017-12-10 18:00 330 查看

题目

从长度为N的字符串中随机选出M个字符(不打破原有顺序)并输出。

思路

此选择问题可分解为:

1. 选择当前字符,并在剩余字符中选择M-1个

2. 不选择当前字符,在剩余字符中选择M个

这就得到了子结构,再考虑出口、何时输出字符串、如果存储之前选择的字符串等细节问题就能写出代码。

代码

/**
* 输出长度为N的字符串的所有长度为M的子序列
* */
public class RandomStrCharCombine {

public static void main(String[] args) {
String s = "ABCDE";
M = 3;
cache = new char[s.length()];
select(s.toCharArray(), 0, M);
}

//存储选择的字符
static char[] cache;
//需要选取的字符的个数
static int M;

/**
*
* @param arr 字符数组
* @param index 开始索引
* @param num 选出字符数
*/
private static void select(char[] arr, int index, int num) {
//数量已经选够,输出cache
if (num == 0) {
System.out.println(String.valueOf(cache, 0, M));
return;
}
if (index == arr.length) {
return;
}

//不选索引处的字符,在剩余字符里面选择num个
select(arr, index + 1, num);
//取当前字符,并从剩余字符里面选num-1个
cache[M - num] = arr[index];
select(arr, index + 1, num - 1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 递归
相关文章推荐