93、动态规划-最长回文子串

news/2024/5/20 17:29:14

思路

首先从暴力递归开始,回文首尾指针相向运动肯定想等。就是回文,代码如下:

public String longestPalindrome(String s) {if (s == null || s.length() == 0) {return "";}return longestPalindromeHelper(s, 0, s.length() - 1);}// 递归方法,用于寻找从left到right范围内的最长回文子串private String longestPalindromeHelper(String s, int left, int right) {if (left == right) {return s.substring(left, right + 1); // 如果左右指针相等,说明是单个字符,单个字符本身是回文}// 如果当前字符串是回文,直接返回这个子串if (isPalindrome(s, left, right)) {return s.substring(left, right + 1);}// 不是回文时,尝试两种情况:忽略左边字符或忽略右边字符String leftPalindrome = longestPalindromeHelper(s, left + 1, right);  // 忽略左边字符String rightPalindrome = longestPalindromeHelper(s, left, right - 1); // 忽略右边字符// 比较这两种情况,返回更长的那个回文子串return leftPalindrome.length() > rightPalindrome.length() ? leftPalindrome : rightPalindrome;}// 辅助方法,用于检查给定字符串s从left到right的部分是否是回文private boolean isPalindrome(String s, int left, int right) {while (left < right) {  // 双指针法检查是否回文if (s.charAt(left) != s.charAt(right)) {return false; // 一旦发现不对称,立即返回false}left++;  // 移动左指针right--; // 移动右指针}return true; // 所有字符均对称,是回文}

递归面临很多重复计算,这个时候可以使用动态规划

动态规划的思路:

  1. 状态定义:定义 dp[i][j] 为布尔值,表示字符串从索引 i 到索引 j 的子串是否为回文。
  2. 初始化:单个字符总是回文,所以对于所有 idp[i][i]true
  3. 状态转移方程:如果 s[i]s[j] 相等,并且内部的子串也是回文(即 dp[i+1][j-1]true 或者 ij 之间的距离小于等于2),那么 dp[i][j] 也应该是 true
  4. 从底向上填表:由于每个状态依赖于左下方的状态(即 dp[i+1][j-1]),我们需要从下向上和从左到右填充这个表。
 public String longestPalindrome(String s) {if (s == null || s.length() == 0) {return "";}int n = s.length();boolean[][] dp = new boolean[n][n];String longest = "";// 填充动态规划表for (int len = 1; len <= n; len++) { // len 是当前子串的长度for (int start = 0; start < n; start++) {int end = start + len - 1;if (end >= n) { // 确保不越界break;}// 设置dp[start][end]的值dp[start][end] = (s.charAt(start) == s.charAt(end)) && (len <= 2 || dp[start + 1][end - 1]);// 如果当前子串是回文,检查它是否是最长的回文if (dp[start][end] && len > longest.length()) {longest = s.substring(start, end + 1);}}}return longest;}


http://www.mrgr.cn/p/34410157

相关文章

大模型微调实战之强化学习 贝尔曼方程及价值函数(五)

大模型微调实战之强化学习 贝尔曼方程及价值函数&#xff08;五&#xff09; 现在&#xff0c; 看一下状态-动作值函数的示意图&#xff1a; 这个图表示假设首先采取一些行动(a)。因此&#xff0c;由于动作&#xff08;a&#xff09;&#xff0c;代理可能会被环境转换到这些状…

团队作业4——项目冲刺 第3篇 Scrum 冲刺博客

这个作业属于哪个课程 软件工程这个作业要求在哪里 团队作业4——项目冲刺这个作业的目标 团队完成任务的分配,明确团队每个人在接下来七天敏捷冲刺的目标其他参考文献这个作业所属团队 SuperNewCode团队成员 张楠 曾琳备 黄铭涛 张小宇 周广1.每日举行站立时会议2.燃尽图3.每…

牛客NC97 字符串出现次数的TopK问题【中等 哈希+优先级队列 Java/Go】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/fd711bdfa0e840b381d7e1b82183b3ee 核心 哈希&#xff0c;优先级队列Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返…

计算机组成原理网课笔记

无符号整数的表示与运算 带符号整数的表示与运算 原反补码的特性对比 移码 定点小数

linux增加环境变量示例

首先,通过 vim ~/.bashrc 命令进入我这个用户的.bashrc文件内 然后在这个文件末尾添加环境变量,比如下面红框中的内容表示添加了路径/home/nfs_new/wangpeng/VSCode-linux-x64/bin为环境变量,实际上这里是把vscode启动命令添加作为环境变量了。其中, $PATH 表示之前所有的…

go学习笔记——Kratos框架

官方文档https://go-kratos.dev/en/docs/getting-started/start/1.安装Go 参考:mac安装go1.20 2.安装Kratos框架 kratos依赖protobuf grpc等框架,需要先进行安装brew install grpc brew install protobuf brew install protoc-gen-go brew install protoc-gen-go-grpc验证pro…

js逆向,参数加密js混淆

关键词 JS 混淆、源码乱码、参数动态加密 逆向目标 题目1&#xff1a;抓取所有&#xff08;5页&#xff09;机票的价格&#xff0c;并计算所有机票价格的平均值&#xff0c;填入答案。 目标网址&#xff1a;https://match.yuanrenxue.cn/match/1目标接口&#xff1a;https://ma…

【Linux】在Linux中执行命令ifconfig, 报错-bash:ifconfig: command not found解决方案

一、报错信息 ifconfig 报错-bash:ifconfig: command not found 同时&#xff0c;通过ip addr查看&#xff0c;也看不到IP信息 二、解决方案 找到ifcfg-ens0文件&#xff0c;此文件的目录在/etc/sysconfig/network-scripts目录下 命令&#xff1a;cd /etc/sysconfig/network…

m基于遗传优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真

1.算法仿真效果 matlab2022a仿真结果如下:遗传优化迭代过程:误码率对比:2.算法涉及理论知识概要低密度奇偶校验码(Low-Density Parity-Check Code, LDPC码)因其优越的纠错性能和近似香农极限的潜力,在现代通信系统中扮演着重要角色。归一化最小和(Normalized Min-Sum, NMS)…

Vue.js-----vue组件

能够说出vue生命周期能够掌握axios的使用能够了解$refs, $nextTick作用能够完成购物车案例 Vue 生命周期讲解 1.钩子函数 目标&#xff1a;Vue 框架内置函数&#xff0c;随着组件的生命周期阶段&#xff0c;自动执行 作用: 特定的时间点&#xff0c;执行特定的操作场景: 组…

交流接触器

一般按负载电流的1.5倍选择;

IPFoxy:什么是静态住宅IP?静态ISP代理指南

静态住宅代理&#xff08;也称为静态ISP代理&#xff09;是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务&#xff1f;下面我具体分享。 一、什么是静态住宅代理&#xff1f; 首先&#xff0c;我…

C++学习笔记——仿函数

文章目录 仿函数——思维导图仿函数是什么仿函数的优势理解仿函数仿函数的原理举例 仿函数——思维导图 仿函数是什么 使用对象名调用operator&#xff08;&#xff09;函数看起来像是在使用函数一样&#xff0c;因此便有了仿函数的称呼&#xff1b;仿函数存在的意义是&#x…

stm32 出现 hard fault 的排查记录

参考链接:https://blog.csdn.net/qq_43118572/article/details/1327596261、先验知识先验知识1: cortex m3 在中断/异常时,会把 8 个寄存器(xPSR、PC、LR、R12 以及R3-R0)的值压入栈。入栈顺序以及入栈后堆栈中的内容如下(CM4 是从低地址到搞地质):地址 寄存器 被保存的…

stm32 将外部 Flash挂载在 SPI 出现数据传输时好时不好的排查过程

现象: 将外部 Flash 挂载在 SPI,在 hardware_init() -> read_jedec_id() 里的 result = spi->wr(spi, cmd_data, sizeof(cmd_data), recv_data, sizeof(recv_data)) 中, recv_data 的值经常不一致,result 的值偶尔为 SFUD_SUCCESS, 大部分会 Error。备注: 正常情况…

力扣每日一题112:路径总和

题目 简单 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 是…

STM32实现1.8寸液晶屏 LCD SPI串口显示屏模块 TFT彩屏(标准库和HAL库实现)

目录 一、所选模块 液晶模块选择&#xff08;淘宝上均有售卖&#xff09; 模块引脚 二、嵌入式单片机型号 三、接线表设计 四、开发环境版本说明 五、标准库实现 六、HAL库实现 七、完整工程&#xff08;内含标准库和HAL库源码&#xff09; 代码链接 一、所选模块 液…