leetcode题库5-- 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
思路
动态规划: 主要是要状态转移方程
P(i,j)=(P(i+1,j−1)&&S[i]==S[j]),其中由于p(i,j)之前要知道p(i+1,j-1),因此遍历时采用由后往前遍历。
回文子串长度为1和2时,单独考虑。
string longestPalindrome(string s) {int len = s.size();vector<vector<int>> dp(len, vector<int>(len));string res = "";//p(i,j) = (p(i+1,j-1) && s[i] == s[j]) for(int i = len-1; i >=0; i--){for(int j = i; j < len; j++){dp[i][j] = (s[i] == s[j]) && (j - i < 2 || dp[i+1][j-1]);//比较长度if(dp[i][j] && j-i+1 > res.size()){res = s.substr(i, j-i+1);} }}return res;}
其它方法
中心扩展
因为回文字符串是中心对称的。因此以各中心向两边扩展比较是否相等,判断是否是回文。包含奇数和偶数一共有n+n-1个中心;
Manacher’s Algorithm 马拉车算法
其思想也是利用了中心扩展法,不过在它的基础上充分利用了回文特点。先将原字符串进行变换,如下
原字符串: abc
改变后: #a#b#c#
其次重点理解maxRight,center这两个变量。
maxRight 是指已出现的回文字符串最右边字符的索引。center是对于的回文中心。这两者是一一对应的。
在遍历过程中,当遍历到 i 时,需要判断 i 和 maxRight的大小。
i >= maxRight 这时,只需按照中心扩展法即可
i < maxRight 因为回文对称的特点,找到 i 对关于center对称的点 mirror , p[mirror]为扩展步数。如果 p[mirror]+i < maxRight ,p[i] = p[mirror] (注:i 和 mirror 是镜像对称的,在没超出center 为 中心的回文字符串时,因此 mirror 点是回文长度等于 i 点)。否则p[i] 暂时等于maxRight-i。后面继续中心扩展计算。
string longestPalindrome(string s) {//变换字符串,插入'#'int len = s.size();string news = "#";for(int i = 0; i < len; ++i){news += s[i];news += '#';}int slen = 2* len +1; //变化后字符串的长度int maxRight= 0; //回文右边扩展最大的索引int center = 0; //回文中心int start = 0; //原字符串回文起始位置int maxLen = 1; //回文字符串的长度int* p = new int[slen];for(int i = 0; i < slen; i++){p[i] = 0;}for(int i = 0; i < slen; ++i){if(i < maxRight){//找到i 关于center 对称的点int mirror = 2 * center -i;p[i] = min(maxRight-i, p[mirror]); //需要理解}int left = i - (1+p[i]);int right = i + (1 + p[i]);while(left >= 0 && right < slen && news[left] == news[right] ) //注意边界{p[i]++;left--;right++;}//判断maxRight是否更新if(i+p[i] > maxRight){maxRight = i+p[i];center = i;}//比较回文长度if(p[i] > maxLen){maxLen = p[i];start = (i-maxLen)/2;}}return s.substr(start, maxLen);}
leetcode题库5-- 最长回文子串相关推荐
- Leetcode题库 5.最长回文子串(C++实现)
文章目录 解析 思路 代码 解析 l为字符串长度 Max为最长回文子串长度 Max_R指向最长回文子串头部 Max_L指向最长回文子串尾部 p_r指向当前回文子串头部下标-1 p_l指向当前回文子串尾 ...
- python【力扣LeetCode算法题库】5- 最长回文子串
5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...
- python【力扣LeetCode算法题库】409-最长回文串(数学 计数器)
最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字 ...
- LeetCode:Longest Palindromic Substring 最长回文子串
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- 【LeetCode 5-中等】最长回文子串(高清截图)
5. [中等]最长回文子串 https://leetcode-cn.com/problems/longest-palindromic-substring/ 给你一个字符串s,找到s中最长的回文子串. ...
- 【LeetCode笔记】5.最长回文子串(Java、动态规划、字符串)
文章目录 题目描述 解法 & 代码: 思路 题目描述 回文:正着念和倒着念一样. 解法 & 代码: 一开始看到子串,想着可能no.3最长重复子串一样用滑动窗口.不过回文串的判断会很麻烦 ...
- LeetCode琅琊榜第二层-最长回文子串问题(动态规划)
LeetCode_5.最长回文字串 难度:中等 关注博主,持续输出优质算法内容 题目链接 目录 1.暴力求解法
- Leetcode:5.longest-palindromic-substring(最长回文子串)
这道题挺难的,暴力法固然爽,但是仍会超时,优化后也是,可能优化不够把: 从0 - length-1用中心扩展法能保证比暴力法O(n^3)低; 好像官网还给出三个方法,有时间可以细琢磨: #includ ...
- 牛客题霸 NC17 最长回文子串
https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6 解决方案 Go Manacher(马拉车)算法 func getL ...
- Leecode刷题热题HOT100(5)——最长回文子串
最新文章
- 张宏江对话清华“智班”:我想看到更多极客
- 提取LSA密码lsadump
- 【网】关于 Blog 和 RSS 的全面介绍
- delete in ST05 trace - deletion will also lead to many DB access first
- Java Word break analysis
- ext2 源代码解析之 “从路径名到目标结点” (一)
- bash 将二进制转换为十进制_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...
- R语言学习笔记(一)R语言的基本操作与函数
- RTSP,RTP,RTCP的区别
- 国外程序员薪资曝光,美国最高,均年薪95879美元
- 转《JAVA和C#得相同点和不同点》
- Mysql 的utf8和utf8mb4
- 计算机硬件密码,计算机硬件技术基础综合性实验任务书(08)密码门锁的模拟_C
- ASP.NET 将Excel导入数据库
- css的重置和原子类的使用
- win7 64位系统下载
- 微信小程序源码及H5小游戏源码内核构建方法
- 研究生学历,毕业就给房!给户口!
- rstudio查询命令_RStudio终端操作
- 当女生成为软件测试员,我才发现年薪30W+其实并不难…