动态规划<四> 回文串问题(含对应LeetcodeOJ题)

目录

引例

其余经典OJ题

1.第一题

 2.第二题

 3.第三题

4.第四题 

 5.第五题

引例

OJ 传送门Leetcode<647>回文子串

画图分析:

使用动态规划解决

原理:能够将所有子串是否是回文的信息保存在dp表中

在使用暴力方法枚举出所有子串,是使用两指针(i,j)依次往后枚举的,且满足i<=j

所以需要建立二维的dp表,在填表时只需填上三角位置即可

1.状态表示:

dp[i][j]表示字符串s的[i,j](i是起始位置,j是结束位置)的这个子串是否是回文

2.状态转移方程

对于线性dp可以采用多画图的方式来分析

3.初始化

因为满足i<=j 并且越界的情况都已经被判断了,是无需做初始化的

4.填表顺序

因为在求dp[i][j]时会用到dp[i+1][j-1]的值,所以填表顺序是整体从下往上,每一行从左往右

5.返回值

返回dp表中true的数量

具体代码

int countSubstrings(string s) 
    {
        int n=s.size();
        vector<vector<bool>> dp(n,vector<bool>(n));//创建dp表
        int ret=0;
        for(int i=n-1;i>=0;--i)//填表
        {
            for(int j=i;j<n;++j)//从i位置开始往后枚举
            {
                if(s[i]==s[j])
                {
                    dp[i][j]=i+1<j? dp[i+1][j-1]:true;
                }
                if(dp[i][j]) ++ret;
            }
        }
        return ret;//返回
    }

其余经典OJ题

1.第一题

OJ 传送门Leetcode<5>最长回文子串

画图分析:

使用动态规划解决

对于本道题是计算最长的回文子串,在上面的例题中已经实现了判断字符串的子串是否是回文,只需在dp表中为true的位置找出最长的回文串

其余的参考上面的例题

5.返回值

在dp表中为true的位置找出最长回文串的起始位置i及长度,返回子串

具体代码:

string longestPalindrome(string s) 
    {
        int n=s.size();
        vector<vector<bool>> dp(n,vector<bool>(n));
        int begin=0,len=1;
        for(int i=n-1;i>=0;--i)
        {
            for(int j=i;j<n;++j)
            {
                if(s[i]==s[j])
                {
                    dp[i][j]=i+1<j? dp[i+1][j-1]:true;
                }

                if(dp[i][j] && j-i+1>len)
                {
                    begin=i;
                    len=j-i+1;
                }
            }
        }
        return s.substr(begin,len);
    }

 2.第二题

OJ 传送门Leetcode<1745>分割回文串IV

画图分析:

 使用动态规划来解决

对于本题是将字符串划分为三子串,只要每个子串是回文串即可

这里可以两下标i,j来划分这个字符串

此时只需要根据上面例题所实现的dp表来逐步划分区间判断 

具体代码:

 bool checkPartitioning(string s) 
    {
        int n=s.size();

        //用dp把所有的子串是否是回文预处理一下
        vector<vector<bool>> dp(n,vector<bool>(n));
        for(int i=n-1;i>=0;--i)
        {
            for(int j=i;j<n;++j)
            {
                if(s[i]==s[j])
                {
                    dp[i][j]=i+1<j? dp[i+1][j-1]:true;
                }
            }
        }

        //枚举所有的第二个子串的起始位置及结束位置
        for(int i=1;i<n-1;++i)
        {
            for(int j=i;j<n-1;++j)
            {
                if(dp[0][i-1] && dp[i][j] && dp[j+1][n-1]) return true;
            }
        }
        return false;
    }

 3.第三题

OJ 传送门Leetcode<132>分割回文串II

画图分析:

 使用动态规划来解决

1.状态表示  ---经验+题目要求

dp[i]表示字符串s.substr(0,i+1)这个子串要分割为回文串的最少分割次数

2.状态转移方程

3.初始化

对于这里的dp表本身在填表时由于j>0是不会访问越界的,但题目求得是最小值

在求dp[i]=min(dp[j-1]+1,dp[i])时,若初始化时都0时,dp[i]=0,是会影响求min的,因此初始化为INT_MAX

4.填表顺序 ------从左往右

5.返回值-------dp[n-1]

具体代码:

int minCut(string s) 
    {
        //预处理一下
        int n=s.size();
        vector<vector<bool>> IsPal(n,vector<bool>(n));
        for(int i=n-1;i>=0;--i)
            for(int j=i;j<n;++j)
             if(s[i]==s[j])
              IsPal[i][j]=i+1<j? IsPal[i+1][j-1]:true;

        vector<int> dp(n,INT_MAX);  
        for(int i=0;i<n;++i)
        {
            if(IsPal[0][i]) dp[i]=0;
            else
            {
                for(int j=1;j<=i;++j)
                 if(IsPal[j][i]) dp[i]=min(dp[j-1]+1,dp[i]);
            }
        }

        return dp[n-1];
    }

4.第四题 

OJ 传送门Leetcode<516>最长回文子序列

画图分析:

 使用动态规划解决

1.状态表示

dp[i]表示以i位置为结尾的所有子序列中,最长回文子序列的长度

当使用此状态表示来求解状态转移方程时 

当求解dp[i]时,因为此题是子序列,所以需要用到dp[i-1],dp[i-2],....,而dp表中存的只是长度,当在每种结果后添加字符s[i]后,并不能保证是继续是回文串,因此推导不出状态转移方程

这时可以借用上面例题的方法来解决这题

状态表示:

dp[i][j]表示s字符串[i,j]区间内的所有子序列,最长回文子序列的长度 

2.状态转移方程

3.初始化

对于本题可以不用初始化,会越界的位置为i==j,而这些位置已经判断过了

 4.填表顺序

整体从上往下,每一行从左往右

5.返回值 dp[0][n-1]

具体代码:

int longestPalindromeSubseq(string s) 
    {
        int n=s.size();
        vector<vector<int>> dp(n,vector<int>(n));

        for(int i=n-1;i>=0;--i)
        {
            for(int j=i;j<n;++j)
            {
                if(s[i]==s[j])
                {
                    if(i==j) dp[i][j]=1;
                    else dp[i][j]=dp[i+1][j-1]+2;
                }
                else
                 dp[i][j]=max(dp[i+1][j],dp[i][j-1]);
            }
        }

        return dp[0][n-1];
    }

 5.第五题

OJ 传送门Leetcode<1312>让字符串成为回文串的最少插入次数

画图分析:

 使用动态规划解决

1.状态表示 根据经验+题目要求

dp[i][j]表示:s字符串[i,j]区间的子串,让它变为回文串的最小操作次数

2.状态转移方程---认识根据s[i]与s[j]的关系来判断

3.初始化:

4.填表顺序

整体从下往上,每一行从左往右

5.返回值   dp[0][n-1]

具体代码:

 int minInsertions(string s) 
    {
        int n=s.size();
        vector<vector<int>> dp(n,vector<int>(n));
        for(int i=n-1;i>=0;--i)
        {
            for(int j=i+1;j<n;++j)
            {
                if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1];
                else dp[i][j]=min(dp[i][j-1],dp[i+1][j])+1;
            }
        }
        return dp[0][n-1];
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941275.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32定时器输出比较----驱动步进电机

定时器输出比较理论 OC(Output Compare)输出比较输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形每个高级定时器和通用定时器都拥有4个输出比较通道高级定时器的前3个通道额外拥有死区生成和互补输出…

Windows电脑部署SD 3.5结合内网穿透随时随地生成高质量AI图像

文章目录 前言1. 本地部署ComfyUI2. 下载 Stable Diffusion3.5 模型3. 演示文生图4. 公网使用Stable Diffusion 3.5 大模型4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 在数字化创意时代&#xff0c;AI技术的发展为我们带来了无限可能。尤其是对于那些追求高效和高…

Easysearch Java SDK 2.0.x 使用指南(二)

在 上一篇文章 中&#xff0c;我们介绍了 Easysearch Java SDK 2.0.x 的基本使用和批量操作。本文将深入探讨索引管理相关的功能&#xff0c;包括索引的创建、删除、开关、刷新、滚动等操作&#xff0c;以及新版 SDK 提供的同步和异步两种调用方式。 SDK 的对象构建有两种方式…

Scala——身份证号码查询籍贯

object Test_身份证查询籍贯 { def main(args: Array[String]): Unit { val code "42005200210030051".substring(0,2) println(code) //判断42是哪个省的 //湖北 // if(code "42"){ // println("42对应省份为&#xff1a;湖北") // }else…

分布式系统架构:限流设计模式

1.为什么要限流&#xff1f; 任何一个系统的运算、存储、网络资源都不是无限的&#xff0c;当系统资源不足以支撑外部超过预期的突发流量时&#xff0c;就应该要有取舍&#xff0c;建立面对超额流量自我保护的机制&#xff0c;而这个机制就是微服务中常说的“限流” 2.四种限流…

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题

2024年11月 蓝桥杯青少组 STEMA考试 Scratch真题&#xff08;选择题&#xff09; 题目总数&#xff1a;5 总分数&#xff1a;50 选择题 第 1 题 单选题 Scratch运行以下程宇后&#xff0c;小兔子会&#xff08; &#xff09;。 A. 变小 B. 变大 C. 变色 D. …

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类 CIFAR10数据集ParNet架构特点优势应用 ParNet结构代码详解结构代码代码详解SSEParNetBlock 类DownsamplingBlock 类FusionBlock 类ParNet 类 训练过程和测试结果代码汇总parnet.pytrain.pytest.py 前面文章我们构…

Docker核心技术和实现原理

目录 1. Docker镜像原理介绍1.1 操作系统基础1.2 Union FS(联合文件系统)1.3 再看 Docker 镜像是什么 2. 镜像的实现原理2.1 Docker 分层存储实现原理2.2 docker 镜像加载原理 3. 镜像分层存储实战3.1 基础知识3.2 实战过程 4. overlay 文件系统工作实战5. Docker卷原理介绍5.1…

AI的进阶之路:从机器学习到深度学习的演变(二)

AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;一&#xff09; 三、机器学习&#xff08;ML&#xff09;&#xff1a;AI的核心驱动力 3.1 机器学习的核心原理 机器学习&#xff08;Machine Learning, ML&#xff09;突破了传统编程的局限&#xff0c;它不再…

34.正则表达式

python正则表达式&#xff0c;使用re模块&#xff0c;模块中三个基础方法来做正则匹配。 match re.match(匹配规则&#xff0c; 被匹配的字符串) 从字符串开头进行匹配&#xff0c;匹配成功返回匹配对象&#xff08;包含匹配的信息&#xff09;&#xff0c;匹配不成功返回空。…

xpath插件安装与使用

1.背景 在使用python爬取页面数据时,经常会遇到解析页面数据,有一个非常好用的插件工具 是:xpath插件 2.安装与使用步骤 步骤1:准备xpath插件,并解压 步骤2:添加扩展程序 点击扩展程序后: 点击:加载已解压的扩展程序 安装成功后: 关闭浏览器,重新打开浏览器就可以使用了 步…

安徽医科大学卫生管理学院与和鲸科技签署“101 数智领航计划”,共拓“医学+AI”学科建设与人才培养

为进一步强化卫生健康人才培养关键方向&#xff0c;着力加强“医学AI”的复合型交叉人才培养&#xff0c;2024 年 12 月 13 日&#xff0c;安徽医科大学卫生管理学院与上海和今信息科技有限公司&#xff08;以下简称“和鲸科技”&#xff09;召开校企合作洽谈会&#xff0c;并正…

spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))

目录 一、单个字符串或对象引用的注入。 &#xff08;1&#xff09;简单案例演示。 1、项目的基本结构和类介绍。 2、接口"UserDao"代码。 3、实现类"UserDaoImpl"代码。 4、spring配置文件。 5、测试类(MainApp)。 6、查看执行结果。(对应成员变量成功注入…

三格电子——新品IE103转ModbusTCP网关

型号&#xff1a;SG-TCP-IEC103 产品概述 IE103转ModbusTCP网关型号SG-TCP-IEC103&#xff0c;是三格电子推出的工业级网关&#xff08;以下简称网关&#xff09;&#xff0c;主要用于IEC103数据采集、DLT645-1997/2007数据采集&#xff0c;IEC103支持遥测和遥信&#xff0c;可…

leetcode-283.移动零-day13

方法一&#xff1a;双指针遇 0 交换 1. 基本思路回顾 该方法使用了两个指针m和i&#xff0c;m用于标记当前已经处理好的非零元素应该放置的位置&#xff0c;i用于遍历整个数组。当遇到nums[m]为0时&#xff0c;会通过内层while循环找到下一个非零元素&#xff08;如果存在的话…

基于LabVIEW的USRP信道测量开发

随着无线通信技术的不断发展&#xff0c;基于软件无线电的设备&#xff08;如USRP&#xff09;在信道测量、无线通信测试等领域扮演着重要角色。通过LabVIEW与USRP的结合&#xff0c;开发者可以实现信号生成、接收及信道估计等功能。尽管LabVIEW提供了丰富的信号处理工具和图形…

Go怎么做性能优化工具篇之基准测试

一、什么是基准测试&#xff08;Benchmark&#xff09; 在 Go 中&#xff0c;基准测试是通过创建以 Benchmark 开头的函数&#xff0c;并接收一个 *testing.B 类型的参数来实现的。testing.B 提供了控制基准测试执行的接口&#xff0c;比如设置测试执行的次数、记录每次执行的…

Windows下使用git配置gitee远程仓库

目录 使用git配置&#xff08;传统方法&#xff09; 1、在桌面新建一个文件夹 2、git clone [ur1] 3、git branch查看分支 4、git branch新建分支&#xff08;重要&#xff09; 5、git push推送新分支 简单版&#xff08;使用git小乌龟&#xff09; 官网下载&#xff1…

DotNetBrowser 3.0.0 正式发布!

&#x1f6e0;️ 重要消息&#xff1a;DotNetBrowser 3.0.0 正式发布&#xff01; 我们很高兴向您介绍全新的 DotNetBrowser 3.0.0 版本。此次更新带来了多项重要功能与优化&#xff0c;进一步提升了 Web 开发的效率和体验。 &#x1f4e2; DotNetBrowser 3.0.0 包含哪些新功…

【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题

目录 为什么要结合项目与算法&#xff1f; 1. 蓝桥杯与《苍穹外卖》项目的结合 实例&#xff1a;基于蓝桥杯算法思想的订单配送路径规划 问题描述&#xff1a; 代码实现&#xff1a;使用动态规划解决旅行商问题 代码解析&#xff1a; 为什么这个题目与蓝桥杯相关&#x…