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

Day50 算法记录| 动态规划 17(子序列)

这里写目录标题

  • 647. 回文子串
  • 516.最长回文子序列
  • 总结

647. 回文子串

1.动态规划和2.中心扩展
这个视频是基于上面的视频的代码

方法1:动态规划
布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
dp[i][j] = (c[i] = c[j]) &&( (j-i<=2) || dp[i+1][j-1] );
在这里插入图片描述

class Solution {public int countSubstrings(String s) {char[] c = s.toCharArray();int n = c.length;boolean[][] dp = new  boolean[n][n];int count =0;for(int j=0;j<n;j++){for(int i=0;i<=j;i++){dp[i][j] = (c[i] == c[j]) &&( (j-i<=2) || dp[i+1][j-1] );if(dp[i][j]) count++;}}
return count;}
}

方法2:中心扩展法
只有两种情况:1.以单个字母为中心 2. 以两个字母为中心
在这里插入图片描述

class Solution {int count =0;public int countSubstrings(String s) {for(int i=0;i<s.length();i++){helper(s,i,i);helper(s,i,i+1);}return count;}public void helper(String s, int left, int right){while(left>=0&&right<s.length()&&s.charAt(left) == s.charAt(right)){count++;left--;right++;}}
}

516.最长回文子序列

两种思路:

思路一:求当前序列 和 反转之后的 最长公共子序列
就是这道题1146一摸一样了
dp[i][j] 表示s1的前i个字符和s2的前j个字符最长…

class Solution {public int longestPalindromeSubseq(String s) {char[] A = s.toCharArray();char[] B = new char[A.length];for(int i=0;i<A.length;i++){B[i] = A[A.length -1-i];}int[][] dp = new int[A.length+1][A.length+1];for(int i=1;i<=A.length;i++){for(int j =1;j<=A.length;j++){if(A[i-1] == B[j-1]){dp[i][j] = dp[i-1][j-1]+1;}else{dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);}}}return dp[A.length][B.length];}
}

思路二:区间DP
子序列的本质就是选与不选
dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]。

在这里插入图片描述

在这里插入图片描述

超出时间限制的递归
在这里插入图片描述

将递归变成循环:

class Solution {public int longestPalindromeSubseq(String s) {char[] A = s.toCharArray();int n = A.length;int[][] dp = new int[n][n];for(int i = n-1;i>=0;i--){dp[i][i] =1;  //2. i==j for(int j=i+1;j<n;j++){ //3.j>iif(A[i]== A[j]){dp[i][j] = dp[i+1][j-1]+2;}else{dp[i][j] = Math.max(dp[i+1][j],dp[i][j-1]);}}}return dp[0][n-1];}
}

总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/108779.html

相关文章:

  • RabbitMQ:概念和安装,简单模式,工作,发布确认,交换机,死信队列,延迟队列,发布确认高级,其它知识,集群
  • 小研究 - 基于解析树的 Java Web 灰盒模糊测试(二)
  • 对于现有的分布式id发号器的思考 id生成器 雪花算法 uuid
  • jmeter中json提取器,获取多个值,并通过beanshell组成数组
  • 通过nvm工具快捷切换node.js版本、以及nvm的安装
  • 企业如何搭建矩阵内容,才能真正实现目的?
  • Arduino驱动MQ5模拟煤气气体传感器(气体传感器篇)
  • Mongodb安装(Centos7)
  • Python 批量处理JSON文件,替换某个值
  • 凯迪正大—SF6泄漏报警装置的主要特点
  • 适配器模式与装饰器模式对比分析:优雅解决软件设计中的复杂性
  • idea使用protobuf
  • 【深度学习_TensorFlow】误差函数
  • mysql按照日期分组统计数据
  • 19 | 分类模型评估指标
  • 【Pycharm2022.2.1】python编辑器最新版安装教程(包含2017-2022的所有版本win/mac/linux)
  • 深度学习-相关概念
  • 眼科医生推荐的台灯 护眼台灯买什么好?
  • 如何使用 ChatGPT 为 Midjourney 或 DALL-E 等 AI 图片生成提示词
  • 【Linux后端服务器开发】Reactor模式实现网络计算器
  • 【WebRTC---源码篇】(二:一)PeerConnection详解
  • 使用tinyxml解析和修改XML文件
  • [Docker实现测试部署CI/CD----相关服务器的安装配置(1)]
  • 【自动化运维】编写LNMP分布式剧本
  • 用Rust实现23种设计模式之单例
  • 小米平板6将推14英寸版!与MIX Fold 3同步推出
  • webpack 的一点知识
  • Python 双目摄像机控制(windows + linux)
  • mybatisplus实现自动填充 时间
  • P5732 【深基5.习7】杨辉三角