动态规划-回文子串问题

文章目录

  • 1. 回文子串(647)
  • 2. 最长回文子串(5)
  • 3. 分割回文串 IV(1745)
  • 4. 分割回文串 II(132)
  • 5. 最长回文子序列(516)
  • 6. 让字符串成为回文串的最少插入次数(1312)


1. 回文子串(647)

题目描述:
在这里插入图片描述

状态表示:
设置一个布尔类型二维数组dp,使用dp[i][j]来表示在i和j这个闭区间内的子串是否为回文子串。
状态转移方程:
当i和j位置的元素相同时分为三种情况,第一种是i等于j,第二种就是i+1等于j,第三种是就是除了i和j位置的元素还包含中间很多元素,那么dp[i][j]=dp[i+1][j-1]。
初始化:
这里无需初始化,都赋为false即可。
填表顺序:
填表要使用到两层循环,从左至右,从上到下。
返回值:
返回值就是返回dp数组中为true的个数。
代码如下:

class Solution {
    public int countSubstrings(String s) {
        int n = s.length();
        boolean[][] dp = new boolean[n][n];

        int ret = 0;
        for (int j = 0; j < n; j++) {
            for (int i = 0; i <= j; i++) {
                if (s.charAt(i) == s.charAt(j)) {
                    if (i == j) {
                        dp[i][j] = true;
                    } else if (i + 1 == j) {
                        dp[i][j] = true;
                    } else {
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                    if (dp[i][j]) {
                        ret++;
                    }

                }

            }

        }

        return ret;
    }
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

2. 最长回文子串(5)

题目描述:
在这里插入图片描述
状态表示:
这题状态表示和上一题一致。
状态转移方程:
这题状态转移方程和上一题也是一致的。
初始化:
初始化就是全是false,即不用初始化。
填表顺序:
从左至右,从上到下。
返回值:
返回dp数组中值为true的元素的i和j坐标差值为最大值的子串。
代码如下:

 class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();

        boolean[][] dp = new boolean[n][n];

        int startIndex = 0;
        int endIndex = 0;
        int max = Integer.MIN_VALUE;
        for (int j = 0; j < n; j++) {
            for (int i = 0; i <= j; i++) {
                if (s.charAt(i) == s.charAt(j)) {
                    if (i == j) {
                        dp[i][j] = true;
                    } else if (i + 1 == j) {
                        dp[i][j] = true;
                    } else {
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                }

                if (dp[i][j] && j - i + 1 > max) {
                    max = j - i + 1;
                    startIndex = i;
                    endIndex = j;
                }
            }
        }
        return s.substring(startIndex, endIndex + 1);
    }
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

3. 分割回文串 IV(1745)

题目描述:
在这里插入图片描述

状态表示:
这题的状态表示与前两题一致。
状态转移方程:
与前两题一致。
初始化:
与前两题一致。
填表顺序:
与前两题一致。
返回值:
这题的返回值有点特殊,需要使用两层循环,将两层循环的下标用来分割字符串s并且判断分割好的三个子串在dp表中的值是否为true,如果都为true最终返回就是true,如果遍历完成没有一次是true,那么就返回false。
代码如下:

class Solution {
    public boolean checkPartitioning(String s) {
        int n = s.length();

        boolean[][] dp = new boolean[n][n];

        for (int j = 0; j < n; j++) {
            for (int i = 0; i <= j; i++) {
                if (s.charAt(i) == s.charAt(j)) {
                    if (i == j) {
                        dp[i][j] = true;
                    } else if (i + 1 == j) {
                        dp[i][j] = true;
                    } else {
                        dp[i][j] = dp[i + 1][j - 1];
                    }
                }

            }
        }

        for (int i = 0; i < n - 1; i++) {
            for (int j = i; j < n - 1; j++) {
                if (dp[0][i] && dp[i + 1][j] && dp[j + 1][n - 1]) {
                    return true;
                }
            }
        }

        return false;

    }
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

4. 分割回文串 II(132)

题目描述:
在这里插入图片描述

状态表示:
这里有两个动态数组,第一个sup二维数组用于辅助运算,思想和前面几题类似,就是判断i到j位置是否为一个回文子串。第二个一维的动态数组dp,dp[i]表示以i位置元素为结尾的子串可以被分割为多个回文子串的最小次数。
状态转移方程:
对于二位数组的状态转移方程我们不多赘述,前面几题用很多。对于一维数组的dp[i],如果0~i是一个回文子串,那么dp[i]的值就是0,另一种情况就是0到i不是一个回文子串,那么我们固定住i,利用一个循环来遍历i前面的元素使用j来表示,如果j到i是一个回文子串,那么更新dp[i]=Math.min(dp[i],dp[j-1]+1)。
初始化:
为了不影响运算,将dp数组全初始化为最大值。
填表顺序:
dp数组从左至右。
返回值:
因为要返回整个字符串的最小分割次数,所以直接返回dp[n-1]即可。
代码如下:

class Solution {
    public int minCut(String s) {
        int n = s.length();

        boolean[][] sup = new boolean[n][n];
        for (int j = 0; j < n; j++) {
            for (int i = 0; i <= j; i++) {
                if (s.charAt(i) == s.charAt(j)) {
                    if (i == j) {
                        sup[i][j] = true;
                    } else if (i + 1 == j) {
                        sup[i][j] = true;
                    } else {
                        sup[i][j] = sup[i + 1][j - 1];
                    }
                }

            }

        }

        int[] dp = new int[n];
        for (int i = 0; i < n; i++) {
            dp[i] = Integer.MAX_VALUE;
        }

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

            }

        }
        return dp[n - 1];
    }
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

5. 最长回文子序列(516)

题目描述:
在这里插入图片描述

状态表示:
和第二题一致。
状态转移方程:
和第二题一致。
初始化:
和第二题一致。
填表顺序:
和第二题一致。
返回值:
这题和第二题就是一样的题目,只不过第二题要返回字符串,但是这里返回的只是长度。
代码如下:

class Solution {
    public int longestPalindromeSubseq(String s) {
        int n = s.length();
        boolean[][] dp = new boolean[n][n];

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

        }

        return max;

    }
}

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

6. 让字符串成为回文串的最少插入次数(1312)

题目描述:
在这里插入图片描述

状态表示:
使用二位数组dp[i][j]表示在i和j区间的子串变成回文子串的最小插入次数。
状态转移方程:
分为两种情况,第一种i和j位置元素相等时,当i+1等于j时,dp[i][j]=0,当i等于j时,dp[i][j]=0,当i+1<j时,dp[i][j]=dp[i+1][j-1]。第二种情况当i和j位置元素不相等时,需要插入元素所以dp[i][j]=Math.min(dp[i+1][j],dp[i][j-1])+1;
初始化:
无需初始化。
填表顺序:
从下到上,从左至右。
返回值:
返回0到n-1的原字符串的最小分割次数即dp[0][n-1]。
代码如下:

class Solution {
    public int minInsertions(String s) {
        int n = s.length();

        int[][] dp = new int[n][n];

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

            }
        }

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

题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)

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

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

相关文章

【千帆平台】使用AppBuilder三步手搓应用创建精准多轮对话agent之K12互动式练习题

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用头像应用名称应用描述角色指令能力扩展开场白 …

ImportError: DLL load failed while importing win32api: 找不到指定的模块

问题描述 在pip install pywin32后有概率出现import win32api 报错ImportError: DLL load failed while importing win32api: 找不到指定的模块。怎么解决&#xff0c;更新重装都不行。下面给出个人可行的解决方案。 解决方案&#xff1a; 1、打开cmd切换到环境的Scripts文件…

【Linux】常用命令大揭秘,轻松驾驭终端世界

常见命令大全 概念1.1&#xff1a;开源、闭源的区别1.2&#xff1a;应用场景 发行版XShell3.1&#xff1a;使用XShell登入主机3.2&#xff1a;普通用户的增加、删除3.3&#xff1a;查看账户的信息whoami指令who指令 文件和目录基本命令4.1&#xff1a;指令的周边知识文件路径Li…

基于Unity+Vue通信交互的WebGL项目实践

unity-webgl 是无法直接向vue项目进行通信的&#xff0c;需要一个中间者 jslib 文件 jslib当作中间者&#xff0c;unity与它通信&#xff0c;前端也与它通信&#xff0c;在此基础上三者之间进行了通信对接 看过很多例子&#xff1a;介绍的都不是很详细&#xff0c;不如自己写&…

大语言模型在人类层面预测未来的研究与应用

概述 这项研究将探讨语言模型&#xff08;LM&#xff09;能否预测未来事件。在这项研究中&#xff0c;将开发一个系统来自动收集信息、生成和汇总预测结果。将从一个竞争性预测平台收集有关问题的数据&#xff0c;以评估 LM 的预测能力。结果表明&#xff0c;LM 可以与具有竞争…

STL中常见的算法及其应用(一)

总述: 一、常见的遍历算法 1、for_each//遍历容器 函数原型: for_each(iterator beg, iterator end, _func); beg:开始迭代器; end:结束迭代器; _func:函数或者函数对象; 总结:for_each函数在STL中十分重要,需要熟练掌握 示例: std::for_each 是 C++ 标准…

C#语言入门

一、基础知识 1. 程序语言是什么 用于人和计算机进行交流&#xff0c;通过程序语言让计算机能够响应我们发出的指令 2. 开发环境 IDE&#xff0c;集成开发环境。它就是一类用于程序开发的软件&#xff0c;这一类软件一般包括了代码编辑、编译器、调试器、图形用户界面等等工…

基于缓存注解的时间戳令牌防重复提交设计

文章目录 一&#xff0c;概述二&#xff0c;实现过程1、引入pom依赖2、定义缓存管理3、时间戳服务类4、模拟测试接口 三&#xff0c;测试过程1&#xff0c; 模拟批量获取2&#xff0c; 消费令牌 四&#xff0c;源码放送五&#xff0c;优化方向 一&#xff0c;概述 API接口由于…

IDEA 多模块项目报错 Cannot Save Settings 问题

IDEA 多模块项目报错 Cannot Save Settings 问题 Cannot Save Settings&#xff1a; Module "spring_cloud_sentinel_demo" must not contain source root "D:\java_test\Intesij_idea\spring_cloud_sentinel_demo\order_service_rest\src\main\resources"…

一文带你了解MySQL的MySQL的日期函数

&#x1f339;作者简介&#xff1a;✌全网粉丝10W&#xff0c;前大厂员工&#xff0c;多篇互联网电商推荐系统专利&#xff0c;现有多家创业公司&#xff0c;致力于建站、运营、SEO、网赚等赛道。也是csdn特邀作者、博客专家、Java领域优质创作者&#xff0c;博客之星、掘金/华…

【解决方案】Can‘t exec “locale”: No such file or directory

【解决方案】Cant exec “locale”: No such file or directory 还可能出现的错误&#xff1a; 1. 报错原因&#xff1a; 缺少ldconfig 2. 解决方案&#xff1a; sudo apt-get download libc-bin dpkg -x libc-bin*.deb unpackdir/ sudo cp unpackdir/sbin/ldconfig /sbin/ s…

mysql 数据转excel文件

mysql 数据转excel文件 缘由 为售后拉取数据&#xff0c;用navicat太墨迹了&#xff0c;用python写一个main方法跑一下&#xff1b; 1.抽取共同方法&#xff0c;封装成传入mysql&#xff0c;直接下载成excel&#xff1b; 2.写入所有sql语句&#xff0c;传入参数&#xff1b; 代…

20240502解决ARM32编译器编译quectel-CM时for循环出错的解决

20240502解决ARM32编译器编译quectel-CM时for循环出错的解决 2024/5/2 17:17 缘起&#xff1a;QMIThread.c:2100:9: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode 1、修改Makefile为ARM32架构&#xff1a; Z:\quectel-CM\Makefile ifneq ($…

Web安全研究(七)

NDSS 2023 开源地址&#xff1a;https://github.com/bfpmeasurementgithub/browser-fingeprint-measurement 霍普金斯大学 文章结构 introbackground threat model measurement methodology step1: traffic analysisstep2: fingerprint analysis dataset attack statisticsbro…

Node.js -- mongoose

文章目录 1. 介绍2. mongoose 连接数据库3. 插入文件4. 字段类型5. 字段值验证6. 文档处理6.1 删除文档6.2 更新文档6.3 读取文档 7. 条件控制8. 个性化读取9. 代码模块化 1. 介绍 Mongoose是一个对象文档模型库&#xff0c;官网http://www.mongoosejs.net/ 方便使用代码操作mo…

【跟马少平老师学AI】-【神经网络是怎么实现的】(七-2)word2vec模型

一句话归纳&#xff1a; 1&#xff09;CBOW模型&#xff1a; 2c个向量是相加&#xff0c;而不是拼接。 2&#xff09;CBOW模型中的哈夫曼树&#xff1a; 从root开始&#xff0c;向左为1&#xff0c;向右为0。叶子结点对应词有中的一个词。每个词对应唯一的编码。词编码不等长。…

Debian 12 tomcat 9 catalina 日志信息 中文显示乱码

目录 问题现象 解决办法&#xff1a; 1、设定Debian locale 2、设定catalina.sh utf8字符集 问题现象 Debian 12 linux操作系统中&#xff0c;tomcat 9 catalina 启动日志输出 中文乱码 解决办法&#xff1a; 1、设定Debian locale 先确保系统本身就支持中文的 Debian …

Python 全栈体系【四阶】(三十八)

第五章 深度学习 八、目标检测 3. 目标检测模型 3.2 YOLO 系列 3.2.1 YOLOv1&#xff08;2016&#xff09; 3.2.1.1 基本思想 YOLO&#xff08;You Only Look Once &#xff09;是继 RCNN&#xff0c;fast-RCNN 和 faster-RCNN 之后&#xff0c;Ross Girshick 针对 DL 目…

【C++】set与map的使用

目录 一、set&#xff1a; 1、set介绍&#xff1a; 2、常用构造&#xff1a; 3、常用修改操作&#xff1a; &#xff08;1&#xff09;insert&#xff1a; &#xff08;2&#xff09;find &#xff08;3&#xff09;erase&#xff1a; 4、其他操作&#xff1a; &#…

【linuxC语言】守护进程

文章目录 前言一、守护进程的介绍二、开启守护进程总结 前言 在Linux系统中&#xff0c;守护进程是在后台运行的进程&#xff0c;通常以服务的形式提供某种功能&#xff0c;如网络服务、系统监控等。守护进程的特点是在启动时脱离终端并且在后台运行&#xff0c;它们通常不与用…