回文子串、回文子序列相关题目

回文子串、回文子序列相关题目

回文子串是要连续的,回文子序列可不是连续的。

516. 最长回文子序列

dp数组含义dp[i][j]dp[i][j]dp[i][j] 表示子序列 s[i,j]s[i,j]s[i,j] 中的最长回文子序列的长度。

dp数组初始化:子序列长度为 1 时,最长回文子序列的长度就是 1, 即s[i,i]=1s[i,i]=1s[i,i]=1

递推公式

  • 如果 s[i]==s[j]s[i]==s[j]s[i]==s[j] ,那么相比于 s[i+1,j−1]s[i+1,j-1]s[i+1,j1]s[i,j]s[i,j]s[i,j] 的最长子序列的长度增加了 2(首尾)
  • 如果 s[i]≠s[j]s[i]\ne s[j]s[i]=s[j],那么 s[i,j]s[i,j]s[i,j] 的最长子序列的长度就是 s[i+1,j],s[i,j−1]s[i+1,j],s[i,j-1]s[i+1,j],s[i,j1] 中的较大者(取首或者取尾)

遍历顺序

这里顺序比较讲究,我们知道,动态规划解法的遍历顺序需要遵循的原则要按照递推公式的依赖关系,即递推公式中计算 dp 数组中的某个值时一定要保证它所依赖的值已经在 dp 数组中被计算好了

在本题中,我们看到递推公式中,dp[i][j]dp[i][j]dp[i][j] 的值依赖于三个值:dp[i+1][j−1]dp[i+1][j-1]dp[i+1][j1]dp[i+1][j]dp[i+1][j]dp[i+1][j]dp[i][j−1]dp[i][j-1]dp[i][j1],我们所选择的遍历顺序需要保证在计算 dp[i][j]dp[i][j]dp[i][j] 时这三个值都已经计算过了,那么很明显的,iii 要从大往小,jjj 要从小往大。

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

5. 最长回文子串

dp数组含义dp[i][j]dp[i][j]dp[i][j] 表示子串 s[i,j]s[i, j]s[i,j] 是否为回文串。

dp数组初始化:长度为 1 的子串,即 s[i,i]s[i,i]s[i,i] 一定是回文串。

递推公式

  • 如果 s[i]≠s[j]s[i]\ne s[j]s[i]=s[j],那么 s[i,j]s[i,j]s[i,j] 一定不是回文串;
  • 如果 s[i]==s[j]s[i]==s[j]s[i]==s[j], 那要再看子串的长度:
    • 如果子串长度小于等于 3, 那 s[i,j]s[i,j]s[i,j] 一定是回文串
    • 如果子串长度大于 3,则 s[i,j]s[i,j]s[i,j] 是不是回文串就取决于 s[i+1][j−1]s[i+1][j-1]s[i+1][j1] 是不是回文串。如 sabas 是不是回文串取决于 aba 是不是回文串。

遍历顺序

外层循环遍历子串的长度,内层循环遍历起始位置,这里也可以考虑与上面类似的遍历顺序思路,会在下一题中给出代码。

class Solution {
public:string longestPalindrome(string s) {int n = s.size();if (n < 2) return s;string ans(1, s[0]);vector<vector<bool>> dp(n, vector<bool> (n));for (int i=0; i<n; ++i) dp[i][i] = true;for (int len=2; len<=n; ++len) {for (int i=0; i<n; ++i) {int j = i + len - 1;if (j >= n) break;if (s[i] != s[j]) dp[i][j] = false;else {if (len <= 3) dp[i][j] = true;else dp[i][j] = dp[i+1][j-1];}if (dp[i][j] && len>ans.size()) ans = s.substr(i, len);}}return ans;}
};

647. 回文子串

思路和上一题逻辑类似

遍历顺序一,与上题一致

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

另一种根据长度和起始位置的遍历顺序,思路类似题516:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mmdetection tools工具梳理

mmdetection tools工具梳理 mmdetection 是一个非常好用的开源目标检测框架&#xff0c;我们可以用它方便地训练自己的目标检测模型&#xff0c;mmdetection 项目仓库提供许多实用的工具来实现帮助我们进行各种测试。本篇将梳理以下 mmdetection 项目仓库 tools 目录下的各种实…

TensorRT ONNX 基础(续)

TensorRT ONNX 基础&#xff08;续&#xff09; PyTorch正确导出ONNX 几条推荐的原则&#xff0c;可以减少潜在的错误&#xff1a; 对于任何使用到 shape、size 返回值的参数时&#xff0c;例如 tensor.view(tensor.size(0), -1) 这类操作&#xff0c;避免直接使用 tensor.s…

frp实现内网穿透极简教程

frp实现内网穿透极简教程 本文是内网穿透极简教程&#xff0c;为求简洁&#xff0c;我们不介绍为什么内网穿透也不介绍其原理&#xff0c;这里假设各位读者都已经明确的知道自己的目的&#xff0c;本文仅介绍如何安装配置 frp 实现内网穿透。 简单来说&#xff0c;内网穿透就…

图像预处理之warpaffine与双线性插值及其高性能实现

图像预处理之warpaffine与双线性插值及其高性能实现 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ZU4y1A7EG 代码Repo&#xff1a;https://github.com/shouxieai/tensorRT_Pro 本文为视频讲解的个人笔记。 warpaffine矩阵变换 对于坐标点的变换&#xff0c;我们通…

LeetCode-10 正则表达式匹配

LeetCode-10 正则表达式匹配 动态规划 10. 正则表达式匹配 dp数组含义&#xff1a;dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i−1]s[0:i-1]s[0:i−1] 能否被 p[0:j−1]p[0:j-1]p[0:j−1] 成功匹配。 状态转移方程 &#xff1a; 如果 s[i−1]p[j−1]s[i-1]p[j-1]s[i−1]p[j−1] …

shell if判断和for循环常见写法

shell if判断和for循环常见写法 转自&#xff1a; Shell中for循环的几个常用写法 Shell中if 条件判断总结 if常见写法 一、if的基本语法: if [ command ];then符合该条件执行的语句 elif [ command ];then符合该条件执行的语句 else符合该条件执行的语句 fibash shell会按顺序…

关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题

关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题 如果我们想要在 Pytorch 中同时迭代两个 dataloader 来处理数据&#xff0c;会有两种情况&#xff1a;一是我们按照较短的 dataloader 来迭代&#xff0c;长的 dataloader 超过的部分就丢弃掉…

neovim及coc.nvim自动补全初探

neovim及coc.nvim自动补全初探 安装 # mac # 安装 brew install neovim # 查看neovim安装路径 brew list nvim# ubuntu apt install neovim习惯了打开 vi/vim 的方式&#xff0c;可以用个 alias 在 ~/.zshrc 中设置一下&#xff1a; alias vi"nvim"插件 vim-plug…

sed 简明教程

sed 简明教程 转自&#xff1a;https://coolshell.cn/articles/9104.html awk于1977年出生&#xff0c;今年36岁本命年&#xff0c;sed比awk大2-3岁&#xff0c;awk就像林妹妹&#xff0c;sed就是宝玉哥哥了。所以 林妹妹跳了个Topless&#xff0c;他的哥哥sed坐不住了&#xf…

awk 简明教程

awk 简明教程 转自&#xff1a;https://coolshell.cn/articles/9070.html 有一些网友看了前两天的《Linux下应该知道的技巧》希望我能教教他们用awk和sed&#xff0c;所以&#xff0c;出现了这篇文章。我估计这些80后的年轻朋友可能对awk/sed这类上古神器有点陌生了&#xff0c…

应该知道的LINUX技巧

应该知道的LINUX技巧 转自&#xff1a;https://coolshell.cn/articles/8883.html 这篇文章来源于Quroa的一个问答《What are some time-saving tips that every Linux user should know?》—— Linux用户有哪些应该知道的提高效率的技巧。我觉得挺好的&#xff0c;总结得比较好…

[深度][PyTorch] DDP系列第一篇:入门教程

[深度][PyTorch] DDP系列第一篇&#xff1a;入门教程 转自&#xff1a;[原创][深度][PyTorch] DDP系列第一篇&#xff1a;入门教程 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好&#xff1f;那你definitely需要这一篇&#xff01; No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:实现原理与源代码解析

[深度][PyTorch] DDP系列第二篇&#xff1a;实现原理与源代码解析 转自&#xff1a;https://zhuanlan.zhihu.com/p/187610959 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好&#xff1f;那你definitely需要这一篇&#xff01; No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:实战与技巧

[深度][PyTorch] DDP系列第三篇&#xff1a;实战与技巧 转自&#xff1a;https://zhuanlan.zhihu.com/p/250471767 零. 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好&#xff1f;那你definitely需要这一篇&#xff01; No one knows DDP better than I do! – – …

PIL、OpenCV中resize算子实现不同的问题

PIL、OpenCV中resize算子实现不同的问题 测试图像&#xff1a;https://raw.githubusercontent.com/TropComplique/ssd-pytorch/master/images/dogs-and-cats.jpg &#xff08;直接 wget 可获得&#xff09; 测试版本&#xff1a; opencv-python 4.4.0.46Pillow 8.0.1 测试代…

mac X11 XQuartz的安装与使用

mac X11 XQuartz的安装与使用 本地系统&#xff1a;MacOS 12.4 远程主机系统&#xff1a;Ubuntu 18.04 命令说明 ssh命令 ssh 命令大家很熟悉了&#xff0c;这里仅介绍与 X11 forwarding 相关的几个选项。 本部分译自 ssh 命令手册&#xff0c;可见 man ssh -X &#xf…

机器学习:系统设计与实现 分布式训练

机器学习系统:设计与实现 分布式训练 转自&#xff1a;https://openmlsys.github.io/chapter_distributed_training/index.html 随着机器学习的进一步发展&#xff0c;科学家们设计出更大型&#xff0c;更多功能的机器学习模型&#xff08;例如说&#xff0c;GPT-3&#xff09;…

Linux命令行及各常用工具代理设置

Linux命令行及各常用工具代理设置 命令行代理设置 1 通过命令行指定 直接为当前命令行设置代理 对当前终端的全部工具&#xff08;apt、curl、wget、git 等全都有效&#xff09;以下仅以 http 代理为例&#xff0c;如果是其他协议&#xff08;如 socks 等&#xff09;自行改…

VimScript 五分钟入门(翻译)

VimScript 五分钟入门&#xff08;翻译&#xff09; 转自&#xff1a;https://zhuanlan.zhihu.com/p/37352209 译注&#xff1a;折腾 Vim 当然要能看懂和改写相关脚本&#xff0c;而中文资料匮乏&#xff0c;缺一个提纲挈领的教程。本文翻译自 Andrew Scala 的 《Five Minute V…

C++多线程推理、生产者消费者模式封装

C多线程推理、生产者消费者模式封装 tensorRT从零起步迈向高性能工业级部署&#xff08;就业导向&#xff09; 课程笔记&#xff0c;讲师讲的不错&#xff0c;可以去看原视频支持下。 深度学习推理中的多线程知识概览 本章介绍的多线程主要是指算法部署时所涉及的多线程内容&a…