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

子序列相关题目总结

1. 一维dp数组

不连续–最长递增子序列

特点:递增+不连续的子序列
思路:每个节点的dp[i]取决于该节点前边所有节点的状态,前边比它小的节点的最大dp[i] 再加 1
(故使用两层循环)

连续–最长连续递增序列

特点:递增+连续的子序列
思路:每个节点的dp[i]只取决于前一个节点的状态,如果当前节点的dp[i] > dp[i - 1],则直接加1;否则重置为1(一层循环即可)

最大子序和

思路:每个节点只有两个状态:加上/不加,如果加上更大就加,否则就自己做头

2. 二维dp数组

连续–最长重复子数组

特点:两个数组 + 连续重复
思路:使用二维dp数组(小技巧:把dp数组多设置一圈–多头一行和头一列),因为是连续重复,所以可以只记录相等情况即可

不连续–最长公共子序列

特点:两个数组 + 不连续重复
思路:跟连续–最长重复子数组的区别是:也必须记录不相等的情况,因为需要延续状态。当不相等时,就看左边和上边哪个大即可
变形:不相交的线,他们本质都是找一个有序的相同子序列

距离问题(两个字符串的关系)

  1. 判断子序列:
    ① 使用双指针
    ② 动态规划
    if((s.charAt(i - 1) == t.charAt(j - 1) ) && dp[i - 1][j - 1]){
    dp[i][j] = true;
    }
    else{
    dp[i][j] = dp[i][j - 1] && dp[i - 1][j];
    }
  2. 两个字符串的删除操作
    当字符相等时:最小操作数dp[i][j] = dp[i - 1][j - 1];
    当字符不相等时:最小操作数dp[i][j]执行删除操作①删word1[i - 1],最少操作次数为dp[i - 1][j] + 1;②删word2[j - 1],最少操作次数为dp[i][j - 1] + 1;③同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2
  3. 编辑距离
    当字符相等时:最小操作数dp[i][j] = dp[i - 1][j - 1];
    当字符不相等时:最小操作数dp[i][j]可以有三种操作:①替换–dp[i][j] = dp[i - 1][j - 1] + 1; ②删除–dp[i][j] =dp[i - 1][j] + 1;③添加–dp[i][j - 1] + 1;

回文子串

  1. 连续问题:回文子串
    这里的特点是dp数组含义、遍历顺序
    ①dp数组:二维dp数组–从i到j的子串是不是回文子串
    如果s.charAt(i) == s.charAt(j),会出现三种情况:i和j是同一个字母;i和j相连;i和j中间有字母:
 if(s.charAt(i) == s.charAt(j)){if(j - i > 1 && dp[i + 1][j - 1]){dp[i][j] = true;res++;}else if(j - i <= 1){dp[i][j] = true;res++;}}

②遍历顺序:

for(int i = len - 1; i >= 0; i--){for(int j = i; j < len; j++){ //j从i开始!!
  1. 不连续问题:最长回文子序列
    ①dp数组:二维dp数组–从i到j的回文子串的最大长度
if(s.charAt(i) == s.charAt(j)){dp[i][j] = dp[i + 1][j - 1] + 2; 
}
else{dp[i][j] = Math.max(dp[i][j - 1], dp[i + 1][j]);
}

②遍历顺序

for(int i = len - 1; i >= 0; i--){dp[i][i] = 1; //初始化for(int j = i + 1; j < len; j++){  //从i+1开始
http://www.xdnf.cn/news/9291.html

相关文章:

  • 数据结构与算法Day3:绪论第三节抽象数据类型、算法及其描述
  • 图论回溯
  • Linux基本指令篇 —— touch指令
  • SOC-ESP32S3部分:16-I2C
  • java常用工具类:生成唯一id
  • 对称二叉树
  • STM32F407VET6学习笔记5:STM32CubeMX配置串口工程_HAL库
  • 互联网大厂Java求职面试:从Spring到微服务的技术探讨
  • go tour方法和接口
  • 解决Linux下C++智能指针编译错误:`_Lock_policy`未定义问题
  • 高光谱成像相机应用:纸质文物“狐斑”无损检测
  • 华为HCIP-Cloud-Service认证H13-821V2.0-002
  • Qtc++开发遇到的问题-按钮点击不管用?
  • “以光惠算”走进校园,湖北大学用F5G-A全光网赋能智慧校园
  • 服务发现Nacos
  • 以少学习:通过无标签数据从大型语言模型进行知识蒸馏
  • HTTP/2与HTTP/3特性详解:为你的Nginx/Apache服务器开启下一代Web协议
  • Unity 游戏优化(持续更新中...)
  • React从基础入门到高级实战:React 核心技术 - 动画与过渡效果:提升 UI 交互体验
  • 前端八股之HTML
  • mobaxterm通过ssh登录docker无图形界面
  • 自然语言处理入门及文本预处理
  • 华为云Flexus+DeepSeek征文|ModelArts Studio开通DeepSeek-V3与R1商用服务实践与体验
  • 速通《Sklearn 与 TensorFlow 机器学习实用指南》
  • PyTorch入门-torchvision
  • 零基础远程连接课题组Linux服务器,安装anaconda,配置python环境(换源),在服务器上运行python代码【3/3 适合小白,步骤详细!!!】
  • 【R语言编程绘图-折线图】
  • Redis C语言连接教程
  • Linux 环境下C、C++、Go语言编译环境搭建秘籍
  • 常见编码小结