打印一个字符串的全部子序列

我们先来看看字符串的子串和子序列有什么区别?

字符串的子串:必须是连续的一段

字符串的子序列:可以不连续,但是相对次序不能乱(每个字符 要跟不要 所有的路都走一遍)——深度优先遍历

看下图,


仔细看上边的子序列,是不是就是深度优先遍历呢,哈哈哈。

那么具体如何暴力递归呢,有的时候如果没有思路的话硬写也写不下去,那就只有写一步看一步,如果发现写不下去了,可能是缺少变量啥的,具体分析请看注释。

// str 固定不变的字符串// index此时来到的位置 要或者不要,做选择// ans 如果index来到了str中的终止位置,把沿途路径所形成的答案放入ans中// path 之前做出的选择public static void process1(char[] str,int index,List<String> ans,String path) {// 如果index来到了字符串的最后一个位置// 只需要把沿途路径加入ans,然后返回if(index==str.length) {ans.add(path);return ;}// 如果没有来到最后一个位置,就要考虑要不要index位置的字符// 不要index位置的字符,往下做选择String no=path;process1(str, index+1, ans, no);// 要index位置的字符,往下做选择String yes=path+String.valueOf(str[index]);process1(str, index+1, ans, yes);}public static List<String> printAllSubsequences(String s){char[] str=s.toCharArray();List<String> ans=new LinkedList<>();String path="";process1(str, 0, ans, path);return ans;}

现在我们把题目改一下,如果价格条件,要去重,题目变为:

打印一个字符串的全部子序列,要求不要出现重复字面值的子序列

上面举的例子是字符串abc,如果是字符串aaa呢,是不是肯定有字面值重复的子序列。

解决办法:递归方式还是一样,只需要把原先用来装答案的容器改为HashSet就可以,其它都一样,因为集合可以自动去重。主方法调用也需要改一下,返回的时候遍历集合,放入List后再返回结果就可以了。

public static void process2(char[] str,int index,HashSet<String> ans,String path) {if(index==str.length) {ans.add(path);return ;}String no=path;process2(str, index+1, ans, no);String yes=path+String.valueOf(str[index]);process2(str, index+1, ans, yes);}public static List<String> printNoRepeat(String s){char[] str=s.toCharArray();HashSet<String> set=new HashSet<>();String path="";process2(str, 0, set, path);List<String> ans=new ArrayList<>();for(String cur:set) {ans.add(cur);}return ans;}

如果题目要求不用打印所有字面值不重复的子序列,而是只需要知道所有字面值不重复的子序列的个数,那么这其实是一个经典的动态规划问题,博主后序文章一定会写到的,这篇文章就到这啦,感谢你的三连或者点赞支持

暴力递归——打印一个字符串的全部子序列相关推荐

  1. 算法-打印一个字符串的全部子序列,包括空字符串

    题目:打印一个字符串的全部子序列,包括空字符串 假如该字符串为"abc"则用画图的方式穷举所有可能 代码如下: public class PrintAllSubsquences { ...

  2. 打印一个字符串的全部子序列,包括空字符串

    package class_08;import java.util.ArrayList; import java.util.List; /*** * 打印一个字符串的全部子序列,包括空字符串**/ p ...

  3. 打印一个字符串的所有排列。

    //打印一个字符串的所有排列. void printSequence(char* pChara) {   int i = 0;  static int MAX_LEN = strlen(pChara) ...

  4. 算法入门篇九 暴力递归

    牛客网 左程云老师的算法入门课 暴力递归 原则  汉诺塔问题 问题 打印n层汉诺塔从左边移动到最右边的过程 思想 一共六个过程,左到右.左到中,中到左,中到右,右到左,右到中,互相嵌套使用 左到右 将 ...

  5. 算法与数据结构——算法基础——暴力递归(回溯)(java)(左程云b站课程总结)

    暴力递归 暴力递归就是尝试 类似于回溯:可以理解为回溯就是在暴力递归的基础上在每个操作步骤加上标记和取消标记的处理 把问题转化为规模缩小了的同类问题的子问题 有明确的不需要继续进行递归的条件(base ...

  6. 算法笔记(二)暴力递归回溯搜索

    文章目录 前缀树 贪心算法 有限时间完成最多次的会议 最省钱的切割金条方法 赚钱最多的项目安排方案 字典序比较方法 一个数据流中随时可以取得中位数 N皇后问题 位运算优化的N皇后问题 汉诺塔问题 打印 ...

  7. leetcode 712. Minimum ASCII Delete Sum for Two Strings | 712. 两个字符串的最小ASCII删除和(暴力递归->傻缓存->DP)

    题目 https://leetcode.com/problems/minimum-ascii-delete-sum-for-two-strings/ 题解 经典的 暴力递归 -> 傻缓存 -&g ...

  8. 字符串所有排列组合暴力递归

    给你一个字符串"acb",可以打印出六种排列组合,这里又是一种index推动的递归,但是这里有一些小trick,就是从第一个开始,在后面的字符串的每一个字符进行交换,这样就可以省很 ...

  9. leetcode 678. Valid Parenthesis String | 678. 有效的括号字符串(带缓存的暴力递归)

    题目 https://leetcode.com/problems/valid-parenthesis-string/ 题解 带缓存的暴力递归,非常挫.用一个 string 模拟 stack,方便缓存记 ...

最新文章

  1. 【组队学习】【32期】深入理解计算机系统
  2. Java连接Oracle数据库常用方法
  3. MYSQL连接字符串参数详细解析(大全参考)
  4. 程序员智力面试题(一)
  5. 我的MVVM框架 v0.1发布
  6. javascript获取系统时间时区_详解Linux操作系统修改时间和修改时区的方法
  7. Vue计算属性的_set与get方法_实现双向数据传递---vue工作笔记0006
  8. jq写的项目如何部署到静态服务器_如何把前端项目部署到服务器
  9. PTA5-1 最大子列和问题
  10. 从当前文件夹以及子文件夹中,批量移动指定名字的文件
  11. hdu 1251(字典树)
  12. Valve员工手册,一部震惊世界的“人生攻略”
  13. 进程调度算法-先来先服务、最短作业优先调度算法和高响应比优先调度算法
  14. python通信工程定额_通信工程2008版定额和2017版定额简单对比
  15. 最新苹果CMS对接千月版本-畅视影视(V9.3开源)已搭建测试版
  16. 黑马程序员之Web前端全栈 · 阶段一 前端开发基础 (1)
  17. JAVA实现饭店点菜系统详解
  18. 人工智能数学基础3:部分数学符号以及自然数、整数、有理数和实数的势
  19. Centos7部署kubernetes集群CA证书创建和分发(二)
  20. 【OpenCV实战】OpenCV实现人脸检测详解(含代码)

热门文章

  1. postman响应html,postman的使用方法详解!最全面的教程
  2. Python阶乘计算
  3. ubuntu解决无法上网问题
  4. 到处都是才艺表演!!
  5. 常用坐标系及其转换(1)
  6. 【游戏】PC游戏引擎简介及游戏使用技术检测技巧
  7. 线程安全 voliate
  8. C++中voliate关键字
  9. 企业微信社群运营案例拆解:瑞幸咖啡
  10. 利用CNN对股票“图片”进行涨跌分类——一次尝试【附源码】