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

来源:互联网 发布:beast成员关系解析知乎 编辑:程序博客网 时间:2024/06/09 12:37

题目

从长度为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);  }}
阅读全文
0 0
原创粉丝点击