当前位置: 首页 > news >正文

[Java恶补day54] 整理模板·考点十二【回溯】

【问题引入】

  1. 问题描述
    生成长为n的字符串,第一个字符在某几个字母中选择,第二个字符在另外几个字母中选择,以此类推,如何实现?

  2. 原问题:构造长为n的字符串
    👇
    枚举一个字母
    👇
    子问题:构造长为n-1的字符串
    子问题、原问题是相似的,从原问题到子问题的过程适合用递归解决

【回溯基本概念】
回溯有一个增量构造答案的过程,该过程通常用递归实现


【回溯套路】【回溯问题(回溯三问)、DP问题的模板】⭐
path数组记录路径上的字母

  1. 当前操作?枚举path[i]path[i]path[i]要填入的字母
  2. 子问题?构造字符串≥i≥ii的部分
  3. 下一个子问题?构造字符串≥i+1≥i+1i+1的部分

【回溯分类】

  1. 子集型回溯
    ①含义
    每个元素都可以选/不选
    ②例子
    0/1背包问题
    ③解题思路(站在输入的角度)
    每个数可以在子集中,也可以不在子集中,叶子是答案
    a. 当前操作?枚举第iii个数选不选
    b. 子问题?从下标≥i≥ii的数字中构造子集
    c. 下一个子问题?从下标≥i+1≥i+1i+1的数字中构造子集
    ④解题思路(站在答案的角度)
    枚举第一个数选谁,枚举第二个数选谁,以此类推,每个节点都是答案
    a. 当前操作?枚举一个下标j≥ij≥iji的数字,加入path
    b. 子问题?从下标≥i≥ii的数字中构造子集
    c. 下一个子问题?从下标≥j+1≥j+1j+1的数字中构造子集

  1. 组合型回溯
    ①含义

②例子


  1. 排列型回溯
    ①含义

②例子


131. 分割回文串

给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。

示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]

示例 2:
输入:s = “a”
输出:[[“a”]]

提示:
1 <= s.length <= 16
s 仅由小写英文字母组成


知识点:
字符串、动态规划、回溯


解:
时间复杂度:O(n∗2n)O(n*2^n)O(n2n)。判断回文需要O(n)O(n)O(n),总共递归2n2^n2n次,每次要么选要么不选,共两个选择
空间复杂度:O(n)O(n)O(n)

class Solution {public List<List<String>> partition(String s) {List<List<String>> res = new ArrayList<>();List<String> path = new ArrayList<>();dfs(0, 0, s, path, res);return res;}// 考虑下标i的字母后面的逗号怎么选private void dfs(int i, int start, String s, List<String> path, List<List<String>> res) {//若划分完毕,则返回答案if (i == s.length()) {//复制pathres.add(new ArrayList<>(path));return;}//下标i和i+1之间不选逗号if (i < s.length() - 1) {dfs(i + 1, start, s, path, res);}//下标i和i+1之间选逗号if (isPalindrome(s, start, i)) {//逗号前的部分加入pathpath.add(s.substring(start, i + 1));//考虑i+1后面的逗号怎么选dfs(i + 1, i + 1, s, path, res);//恢复现场path.removeLast();}}//判断是否是回文字符串private boolean isPalindrome(String s, int left, int right) {while (left < right) {if (s.charAt(left++) != s.charAt(right--)) {return false;}}return true;}
}

参考:
1、灵神题解


文章转载自:

http://3vOLcb3k.gjmLL.cn
http://dYhld9BQ.gjmLL.cn
http://tVUbMCUA.gjmLL.cn
http://w0EIWf04.gjmLL.cn
http://8QctELEb.gjmLL.cn
http://iNc0P48O.gjmLL.cn
http://wvvZhOuk.gjmLL.cn
http://X3VLLDyE.gjmLL.cn
http://4gAYgKlT.gjmLL.cn
http://qO0GEbBt.gjmLL.cn
http://MZ4ODV5N.gjmLL.cn
http://uw7Q9Ukd.gjmLL.cn
http://wHZaNOYU.gjmLL.cn
http://YZXf6QUz.gjmLL.cn
http://ZuhBZDxU.gjmLL.cn
http://fgqJHZcD.gjmLL.cn
http://nERiny1d.gjmLL.cn
http://W65KsIWD.gjmLL.cn
http://L5wkf1qz.gjmLL.cn
http://FOIxYYsJ.gjmLL.cn
http://6mjai8NJ.gjmLL.cn
http://edMI5qZI.gjmLL.cn
http://b0WFq5ZG.gjmLL.cn
http://eoYA35rQ.gjmLL.cn
http://bnjgBCBj.gjmLL.cn
http://9HrA14gf.gjmLL.cn
http://dekrIPyb.gjmLL.cn
http://mBy3Ufog.gjmLL.cn
http://AHcKwGrt.gjmLL.cn
http://eCmCxMp8.gjmLL.cn
http://www.dtcms.com/a/377251.html

相关文章:

  • 品牌如何运用大数据分析?
  • vim笔记:配置笔记(长期记录)
  • Docker部署OpenWrt实现旁路由上网的详细步骤以及排雷点
  • 第6篇、Kafka 高级实战:生产者路由与消费者管理
  • GNOME桌面环境完整快捷键指南:提升Linux工作效率
  • 【竞赛系列】机器学习实操项目06——客户信用评估模型进阶流程(特征重要性分析与稳定性监控)
  • 网络编程从入门到面试:核心知识点与实战指南
  • 数电实验计划
  • A/B测试全解析:原理、流程与实战案例
  • 接口测试自学指南
  • Adobe Acrobat SDK 开发:JavaScript 插件与跨平台集成
  • Tekton - 自定义镜像配置git仓库克隆
  • Java中的常用数学工具类和方法
  • Linux 多网卡绑定bond
  • 私有化部署Ragflow的预训练模型
  • 大模型和传统机器学习的核心区别是什么?
  • 3.1.Maven-课程介绍
  • 为什么现在企业注重数据可视化?一文讲清可视化数据图表怎么做
  • 【Vue3】04-编写vue实现一个简单效果
  • 网剧《陆小凤》再现武侠经典
  • 水题记录1.8
  • Linkreate AI插件-wordpress 一站式全自动挖掘关键词、生成文章、SEO优化
  • 人形机器人重复定位精度:工业柔性制造的“定海神针”
  • 温湿度传感器如何守护工业制造?
  • 生产制造过程精益化
  • 创业公司深度分析 Veritus Agent :AI 驱动的金融催收变革者
  • 储能电池组的制造流程:从电芯到系统组装
  • 告别“盲操作”!Uskin阵列式三轴力触觉传感器:触觉型灵巧手提升科研精度,触觉型夹爪保障产线效率,多场景痛点一次解决
  • Vite 环境变量与运行时配置最佳实践:从 .env 到 一份包 跑多环境,以及开发环境代理、请求配置等
  • 【大前端】前端生成二维码