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

动态规划:求最长回文子串

求最长回文子串

给定一个字符串s,找出s中最长的回文子串

回文字符串:如果一个字符串的逆序和原始字符串相同,则称该字符串为回文字符串。

input:s= "mnbalevelabst";
output:balevelab
reason:

算法思路:

定义状态数组dp,其中dp【i】【j】表示s[i]到s[j]的字符串是否是回文字符串,如果是回文字符串,则令dp【i】【j】=1,如果不是回文字符串,则令dp【i】【j】=0;

如果,s[i]=s[j],那么只要s[i+1]=s[j-1]的字符串是回文字符串,那么s[i]=s[j]的字符串就是回文字符串。反之,s[i+1]=s[j-1]的字符串不是回文字符串,那么s[i]=s[j]的字符串就不是回文字符串。

如果,s[i]!=s[j],那么只要s[i]=s[j]的字符串就一定不是回文字符串。因此,状态转移方程为:

dp【i】【j】=dp【i+1】【j-1】,s【i】=s【j】

		0                                ,s【i】!=s【j】

代码如下:

//求最长回文字符串
string maxHuiwen(string s)
{int len = s.size();int start = 0;//最长的回文子串的起始位置int max_length_huiwen = 1;//定义状态数组dp ,其中dp[i][j]表示s[i]到s[j]的字符串是否是回文字符串,//如果是回文字符串,则令dp【i】【j】=1,//如果不是回文字符串,则令dp【i】【j】=0;int dp[50][50] = { 0 };for (int j = 1; j < len; j++){for (int i = 0; i < j; i++){if (s[i] == s[j]){if (j - i < 3){dp[i][j] = 1;}else{dp[i][j] = dp[i + 1][j - 1];//状态转移方程}}if (dp[i][j] == 1&& (j-i+1)>max_length_huiwen){max_length_huiwen = j - i + 1;start = i;}}}return s.substr(start, max_length_huiwen);
}void test_maxhuiwen()
{string str = "mnbalevelabst";cout << "最长的回文子串为:" << maxHuiwen(str) << endl;
}

代码详解:
j=1,i=0;不满足s[i] == s[j],结束当j=2;
在这里插入图片描述
j=2,i=0;
不满足s[i] == s[j],i++;
在这里插入图片描述
j=2,i=1;
不满足s[i] == s[j],结束当前循环,j++;
在这里插入图片描述
j=3,i=0;
不满足s[i] == s[j],i++;
在这里插入图片描述
一直循环,直到如下:
j=7,i=5;
满足s[i] == s[j],记录在案,记录回文子数组长度max_length_huiwen = j - i + 1=3;start = 5;
在这里插入图片描述
继续循环到下面如下步骤:
一直循环,直到如下:
j=10,i=2;
满足s[i] == s[j],记录在案,记录回文子数组长度max_length_huiwen = j - i + 1=8;start = 2;
在这里插入图片描述
如此,一直到循环结束,该记录的所需数据不会再发生改变。
ps:今天的内容到这里就结束了,谢谢观看!!!

上嘉路

http://www.xdnf.cn/news/14239.html

相关文章:

  • OpenMMlab导出MaskFormer/Mask2Former实例分割模型并用onnxruntime和tensorrt推理
  • DB2连接池监控与挂起连接释放指南
  • Win32OpenSSL工具下载地址
  • Electron截取响应体
  • @Validation 的自定义校验实现, Spring Boot 和 java
  • 实现网页中嵌入B站视频播放器:解决high_quality=1 失效的问题
  • struct stat结构体
  • NY230NY233美光固态闪存NY237NY246
  • 【Transformer拆解】-2. 位置编码(Positional Encoding)
  • 一个密码实现库crypto-work
  • Pandas数据工程深度解析
  • 四数之和-力扣
  • XSS (Reflected)-反射型XSS
  • 晶振常见封装工艺及其特点
  • 深入讲解 Ollama 的源码
  • 【Java多线程从青铜到王者】定时器的原理和实现(十一)
  • Spring依赖注入源码学习:基于XML配置的DI源码解析
  • PGCP:用于比较基因组学的植物基因组综合数据库-文献精读144
  • 信息学奥赛一本通 1543:【例 3】与众不同
  • ubuntu之坑(十四)——安装FFmpeg进行本地视频推流(在海思平台上运行)
  • UVM同步的方法
  • RPT:预训练新范式,用强化学习做预训练!
  • 生成式AI如何与RPA融合?
  • Cursor-1.0安装Jupyter-Notebook,可视化运行.ipynb文件中Python分片代码
  • 使用麒麟V10操作系统的KVM服务,但麒麟V10存在高危漏洞无法修复?
  • 【运维】iDRAC、Lifecycle Controller、Unified Server Configurator 的区别
  • 【1/2, 2/3, 3/5, 5/8, 8/13, ...写一个函数,计算以下数列的前10项之和,在主函数中调用该函数并输出结果。】2022-5-19
  • 成都鼎讯短波通信信号模拟设备:短波频段的电磁模拟王者​
  • 【iSAQB软件架构】良好的设计技术
  • spring:使用注解@Configuration、@ComponentScan创建配置类(未完待续)