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

算法-动态规划/中心扩散法-最长回文子串

算法-动态规划/中心扩散法-最长回文子串

1 题目概述

1.1 题目出处

https://leetcode.cn/problems/longest-palindromic-substring

1.2 题目描述

在这里插入图片描述

2 动态规划

2.1 思路

dp[i][j] 表示[i,j]之间的字符串是否是回文。
那么,如果chars[i] = chars[j]时,就有可能构成的子串为回文:

  1. 如果j - i < 3,则子串肯定是回文。比如 aba、aa、a
  2. 如果j - i >=3,则就会用到动态规划了,即 dp[i][j] = dp[i+1][j-1],也就是说 i的下一个字符和j的前一个字符组成的闭区间子串是否是回文,只要是那么本子序列也是。
  3. 这里有个重要的点,表达式为dp[i][j] = dp[i+1][j-1],也就是说i取决于i+1,j取决于j-1,所以遍历时需要i从大到小计算,而j需要从小到大计算。
  4. 遍历过程中,每当判断子序列为回文,就和之前已经找到的最大回文长度的比较,如果更长就更新,并记录下i、j
  5. 最后将字符串从i、j取子序列即可

2.2 代码

public class Solution {public String longestPalindrome(String s) {// 表示[i,j]之间的字符串是否是回文boolean[][] dp = new boolean[s.length()][s.length()];for(int i = 0; i < s.length(); i++) {// 定义同一个位置的为truedp[i][i] = true;}int maxLength = 0;int left = 0, right = 0;for (int i = s.length() - 1; i >= 0; i--) {for (int j = i + 1; j < s.length(); j++) {if (s.charAt(i) == s.charAt(j)) {if (j - i < 3) {dp[i][j] = true;} else {dp[i][j] = dp[i+1][j-1];}if (dp[i][j] && (j - i + 1 > maxLength)) {maxLength = j - i + 1;left = i;right = j;}}}}return s.substring(left, right+1);}}

2.3 时间复杂度

O(N^2)
在这里插入图片描述

2.4 空间复杂度

O(N^2)

3 中心扩散

3.1 思路

从左到右移动,每当移动一次后,往两边扩散,直到两侧边界字符不符合回文规则。

3.2 代码

public class Solution {int maxLength = 0;int left = 0, right = 0;public String longestPalindrome(String s) {for (int i = 0; i < s.length() - 1; i++) {// 字符串奇数长度时,中间一个字符串往两边扩散spread(i, i, s);// 字符串偶数长度时,中间两个字符串往两边扩散spread(i, i+1, s);}return s.substring(left, right+1);}private void spread(int i, int j, String s) {while (i >= 0 && j < s.length()) {if (s.charAt(i) != s.charAt(j)) {break;} i--;j++;}// 把多减了、加了的补上i++;j--;if (j - i + 1 > maxLength) {left = i;right = j;maxLength = j - i + 1;}}
}

3.3 时间复杂度

在这里插入图片描述
O(N^2)

3.4 空间复杂度

O(1)

参考文档

  • 动态规划、中心扩散
  • 图解马拉车算法
http://www.lryc.cn/news/188058.html

相关文章:

  • (6)SpringMVC中使用CharacterEncodingFilter编码过滤器处理请求和响应的乱码问题
  • USB协议层数据格式
  • 加密的重要性,MySQL加密有哪些好处?
  • Python为Excel中每一个单元格计算其在多个文件中的平均值
  • LLM 系列之 Transformer 组件总结
  • 计算机等级考试—信息安全三级真题十
  • 面试总结(mysql定精度/oom排查/spring三级缓存/stream流)
  • uniapp四个元素点击那个哪个变色,其他的还变原来的颜色
  • Springcloud笔记(2)-Eureka服务注册
  • 国庆 day 5
  • 计算机网络 | OSI 参考模型
  • uniapp 实现地图头像上的水波纹效果
  • Zabbix7.0 LTS新功能
  • 充电100%并非都是美事,有时少点更有溢出!如何正确为iPhone充电
  • 【软件测试】JUnit详解
  • hive统计页面停留时间
  • LeetCode 24.两两交换链表中的结点
  • 【每日一记】OSPF区域划分详讲、划分区域的优点好处
  • 复旦管院启动科创战略,培养科技研发人才,引领未来发展!
  • Infinity同步
  • C语言:转义字符
  • 为什么 0.1 + 0.1 !== 0.2
  • 超详细!主流大语言模型的技术原理细节汇总!
  • 本人4年测试经验,211 本科计算机专业,由于互联网裁员,然后谈谈我最近测试面试的总结
  • Android中级——Activity数据恢复过程
  • 国内就能使用的chatgpt网页版,包含AIGC应用工具
  • Fast DDS之RTPS
  • 【算法|动态规划No.16】leetcode931. 下降路径最小和
  • Jenkins 构建时动态获取参数
  • android app开机自启动