代码随想录算法训练营第五十七天|647. 回文子串 516.最长回文子序列

news/2024/10/18 16:52:39/

目录

LeeCode 647. 回文子串 

动态规划法

双指针法

LeeCode 516.最长回文子序列


LeeCode 647. 回文子串 

647. 回文子串 - 力扣(LeetCode)

动态规划法

动规五部曲:

1.确定dp数组及下标含义: 布尔类型的dp[i][j]:区间 [i,j] 的子串是否是回文子串;

2.确定递推公式:当s[i] = s[j]时,情况一:下标i 与 j相同,是回文子串;情况二:下标i 与 j相差为1,是回文子串;情况三:下标:i 与 j 相差大于1的时候,此时s[i]与s[j]已经相同了,区间是不是回文取决于dp[i + 1][j - 1];

if (s[i] != s[j]) dp[i][j] = false;
if (s[i] == s[j]) {if (j - i <= 1) { // 情况一 和 情况二result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { // 情况三result++;dp[i][j] = true;}
}

3.dp数组初始化:dp[i][j] = false;

4.确定遍历顺序:从左到右、从下到上遍历;

5.举例递推dp数组;

代码:

class Solution {
public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(),false));int result = 0;for (int i = s.size() - 1; i >= 0; i--) {for (int j = i; j < s.size(); j++) {if (s[i] == s[j]) {if (j - i <= 1) {result++;dp[i][j] = true;}else if (dp[i + 1][j - 1]) {result++;dp[i][j] = true;}}}}  return result;}
};

时间复杂度:O(n²)                                           空间复杂度:O(n²)

双指针法

思路

确定回文串即从中心向两边扩散看是否对称,中心点可由一个或两个元素组成。

代码

class Solution {
public:int countSubstrings(string s) {int result = 0;for (int i = 0; i < s.size(); i++) {result += extend(s, i, i, s.size());result += extend(s, i, i + 1, s.size());}return result;}int extend(const string& s, int i, int j, int n) {int res = 0;while (i >= 0 && j < n && s[i] == s[j]) {i--; j++; res++;}return res;}
};

时间复杂度:O(n²)                                           空间复杂度:O(1)


LeeCode 516.最长回文子序列

516. 最长回文子序列 - 力扣(LeetCode)

动规五部曲:

1.确定dp数组及下标含义: dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度;

2.确定递推公式:if (s[i] = s[j])  dp[i][j] = dp[i + 1][j - 1] + 2;

                             else  dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);

3.dp数组初始化:if (i== j) dp[i][j] = 1; else dp[i][j] = 0;

4.确定遍历顺序:从左到右、从下到上遍历;

5.举例递推dp数组;

代码:

class Solution {
public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));for (int i = 0; i < s.size(); i++) dp[i][i] = 1;for (int i = s.size() - 1; i >= 0; i--) {for (int j = i + 1; j < s.size(); j++) {if (s[i] == s[j]) 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][s.size() - 1];}
};

时间复杂度:O(n²)                                           空间复杂度:O(n²)


http://www.ppmy.cn/news/386750.html

相关文章

Oralce系列十八:Oracle RAC

Oracle RAC 1. Oracle RAC介绍1.1 基本概念1.2 Oracle RAC应用场景1.3 Oracle RAC的优缺点 2. Oracle RAC架构3. Oracle RAC 的安装 1. Oracle RAC介绍 1.1 基本概念 Oracle RAC&#xff08;Oracle Real Application Server Cluster&#xff09;是一种分布式数据库解决方案&a…

用代码实现一个简单计算器

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《C语言》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造…

编程必备:JAVA多线程详解

目录 前言 1.入门多线程 1.1. 线程、进程、多线程、线程池 1.2.并发、串行、并行 1.3. 线程的实现方式 1.3.1. 继承 Thread 类 1.3.2. 实现 Runnable 接口 1.3.3. 使用 Callable 和 Future 1.3.4. 使用线程池 1.4.线程的状态 1.5. 线程常用方法 1.5.1 sleep() 1.4…

常用函数调用出错解决办法 ——MATLAB的License到期

matlab调用常用函数或者命令是会报错&#xff0c;错误看不太懂&#xff0c;可能是License到期问题。以下是解决办法&#xff0c;非常简单&#xff0c;请有需要的们拿走不谢。 1找到安装目录下的license.lic文件&#xff08;如D:\Program Files\MATLAB\R2017a\licenses&#xf…

垂直梯形校正画质损失多少_请实测过的朋友说一下,投影仪的水平与垂直梯形校正会使投影画面变小...

匿名用户 1级 2017-07-12 回答 梯形校正是投影机的一项实用的附加功能&#xff0c;可以轻松地校正由于仰射或吊顶投影而产生的画面梯形变形。除低档的视频机外&#xff0c;一般投影机均配有梯形校正的功能。目前主流投影机多采用数字(即电子)梯形校正、数字梯形校正是通过软件插…

智能制造发展方向

智能制造的金字塔 在智能制造的金字塔中&#xff0c;智能产品与智能服务可以帮助企业带来商业模式的创新&#xff1b;智能装备、智能产线、智能车间到智能工厂&#xff0c;可以帮助企业实现生产模式的创新&#xff1b;智能研发、智能管理、智能物流与供应链则可以帮助企业实现运…

中小企业网站优化流程

一、选择项目&#xff0c;项目调查&#xff0c;市场分析。 二、 关键词采集工具 1. 尽量多的采集&#xff0c; 2. 作关键词指数分析&#xff0c; 3. 关键整理出来。 【搜索指数】 分出主关键词&#xff1a;减肥 相关关键词&#xff1a;运动减肥 中医减肥….. 长尾关键词…

中国IT前线战士:蚂蚁雄兵

本文写于2001年。 六年前的那个秋天&#xff0c;我成了标准的村儿里人。 从那以后我学会了说“有”&#xff0c;不管客户说他要什么&#xff0c;除非问我有烟没有。 从那以后我学会了攒机&#xff0c;以至于后来再见穿着衣服的机器就难受。 从那儿以后我学会了吃扣和清一色&…