算法思维(递归)训练:输出字符串长度为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); } }
相关文章推荐
- 算法思维(递归)训练:输出字符串字符的全排列
- [面试] 递归 反向输出链表 ,定义一个求字符串长度的函数, 反向输出字符串. 不能再函数内部定义变量.
- 算法练习之(任意长度字符串逆向输出)
- C语言---递归反向输出任意长度的字符串
- 递归问题之一:给定一字符串,输出字符串中所有字符子串的各种组合形式,长度为一个字符到字符串的长度,忽略排序
- C语言---递归反向输出任意长度的字符串
- 算法训练 6-2递归求二进制表示位数 ;求完数;求指数;字符串变换
- [算法] 输出 字符串的全部子组合 [dfs - 递归神技]
- C语言经典算法(六)——递归实现字符串长度的两种方法
- [算法] 输出 字符串的全部子组合 [dfs - 递归神技]
- 程序员面试100题(算法)之递归逆序打印单链表、字符串(同时求字符串长度)
- [面试] 递归 反向输出链表 ,定义一个求字符串长度的函数, 反向输出字符串. 不能再函数内部定义变量.
- 递归:从尾到头输出链表& 从尾到头输出一个字符串 & 定义一个函数求字符串的长度,要求该函数体内不能声明任何变量
- 牛客网华为在线训练---字符串最后一个单词的长度
- 每天学习一算法系列(20)(输入一个表示整数的字符串,把该字符串转换成整数并输出)
- 找出字符串的最长不重复子串,输出长度
- 【每天算法4】编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。
- 【转载】最长上升子序列(LIS)长度的O(nlogn)算法
- 算法训练 最长字符串 C++
- 字符串逆序输出与main函数的递归调用