leetcode 5. 最长回文子串(c++)
题目
思路分析
- 中心扩向两边的思想,根据回文串的性质,如
str = "aba"
,从b
出发,往两边同时遍历并比较字符是否相同即可,令left = i - 1
,right = i + 1
,那么依次比较str[left] == str[right]
是否成立。如成立,继续比较,若不成立,则结束此次迭代,并进行i ++
下一次比较。该方法的最大时间复杂度为O(n^2)
. - 动态规划的思想,该方法由小到大、由短到长进行判断是否是回文串(对于单个字符都默认为回文串,即长度为
1
,该性质也作为初始化dp
数组的条件(dp[i][j]
表示下标从i
到j
的子字符串),即dp[i][j]=true
)。那么后续的判断都在该基础上进行。如判断dp[i][i + len - 1]
回文串true
orfalse
,只需判断s[i] == s[i + len - 1]
是否成立,若成立,则dp[i][i + len - 1] = dp[i + 1][i + len - 2]
,否则dp[i][i + len - 1] = false
。当然,其中存在一个细节问题,请看代码实现。
题解1
class Solution {public:string longestPalindrome(string s) {int left, right;string max_str = "", cur_str = "";for(int i = 0;i < s.length(); ++i){left = i - 1, right = i + 1;cur_str = s[i];for(int j = right; right < s.length(); ++j){if(s[i] == s[j])cur_str += s[j];else{right = j;break;}}while(left >= 0 && right < s.length()){if(s[left] == s[right])cur_str = s[left] + cur_str + s[right];elsebreak;left --;right ++;}max_str = (max_str.size() < cur_str.size() ? cur_str : max_str);if (s.length() - i < max_str.size() / 2)break;}return max_str;}
};
提交结果
题解2
class Solution {public:string longestPalindrome(string s) {if(s.size() <= 1)return s;// Construct dp [i] [j] to indicate whether the substring of the subscripts i to j of the string is a palindrome stringvector<vector<int>> dp(s.size(), vector<int>(s.size()));int start = 0, end = 0;// A single character is a palindrome stringfor(int i = 0;i < s.size(); ++i) dp[i][i] = true;// Traverse from a minimum length of 2for(int len = 2; len <= s.size(); ++len){for(int i = 0; i < s.size() - len + 1; ++i){// Unequal first and last charactersif(s[i] != s[i + len - 1])dp[i][i + len - 1] = false;else{if (len <= 2)dp[i][i + len - 1] = true;// Determine whether the included string is a palindrome stringelse dp[i][i + len - 1] = dp[i + 1][i + len - 2];}// Update the beginning and end positions of the maximum palindrome stringif (dp[i][i + len - 1] && len >= end - start + 1){start = i;end = i + len - 1;}}}return s.substr(start, end - start + 1);}
};
提交结果
leetcode 5. 最长回文子串(c++)相关推荐
- [动态规划|字符串] leetcode 5 最长回文子串
[动态规划|字符串] leetcode 5 最长回文子串 1.题目 题目链接 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例1: 输入: "b ...
- LeetCode 5. 最长回文子串(动态规划)
文章目录 1. 题目 2. 解题 2.1 自己写的DP 2.2 优化后的DP 2.3 中心扩展法 1. 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. ...
- 20200118:(leetcode)最长回文子串(中心扩展算法详解及思考)
最长回文子串(中心扩展算法详解及思考) 题目 中心扩展算法详解 代码实现 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: " ...
- 20200117:(leetcode)最长回文子串(暴力法)
最长回文子串 题目 基本思路 代码实现 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: ...
- leetcode 5. 最长回文子串 暴力法、中心扩展算法、动态规划,马拉车算法(Manacher Algorithm)
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- leetcode - 5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 解题思路: 对于一个字符串,回文子串存在两种情况,第一种情况是???a???的回文子串,第二种情况是???aa ...
- leetcode题解5-最长回文子串
问题描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入:s = "babad" 输出:"bab" 解释:"aba" 同 ...
- LeetCode 516 最长回文子串
思路: 动态规划 dp数组:dp[i][j]表示s[i:j]最长回文子串长度 出口: ●i j相同, dp[i][j] 都为1 ●j=i+1,如果 s[j]=s[i] dp[i][j]=2, ...
- LeetCode 05最长回文子串
题目描述 描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" ...
- [LeetCode][M0005]最长回文子串(Java)(马拉车(Manacher)算法)
题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注 ...
最新文章
- python : unindent dose not math any outer indentation level
- dubbo 单元测试_技术分享——一路踩坑构建Dubbo源码
- 快速记忆python函数-【速学速记】Python 高阶函数
- 【k8s】kuboard获取token命令
- 计算机科学 在职双证,计算机专业在职研究生如何获得双证?
- Windows UI风格的设计(11)
- 使用Spring Boot 2使用OAuth2和不透明令牌进行集中授权
- 工业交换机厂家有哪些,国产工业交换机品牌排行榜
- 如何对一个变量数据进行正则判定_生存分析数据中的BuckleyJamesMultipleRegression Model...
- 做三维模型_这几款倾斜实景三维裸眼3D采集软件你了解吗?
- 如何让你的SQL运行得更快(一)
- 【回环检测】如何理解loopClosing中的连续性检测
- 【图像增强】基于matlab模糊集图像增强【含Matlab源码 394期】
- 重新认识下科技核心目录吧!附容易发的期刊名单
- Java基础视频教程
- 【机器学习】机器学习项目全流程(附带项目实例)
- linux 系统管理员l,系统管理员的 SELinux 指南
- 健身房人物生活锻炼照片调色艺术LR预设
- 关闭windows server服务器的密码过期提示
- Twitter 下载遇到的问题