leetcode最长回文子串C++版
2019-05-13 01:37
357 查看
题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
解决方案:
采用动态规划法:
回文字符串的子串也是回文,比如p[i,j](表示以i开始以j结束的子串)是回文字符串,那么p[i+1,j-1]也是回文字符串。这样最长回文子串就能分解成一系列子问题了。
由于最长回文子串是要求连续的,所以我们可以假设i为子串的起始坐标,j 为子串的终点坐标,其中 i 和 j 都是大于等于 0 并且小于字符串长度 len 的,且 i<= j,这样子串的长度就可以使用 j - i + 1 表示了。
我们从长度为 1 的子串依次遍历,长度为 1 的子串肯定是回文的,其长度就是 1;然后是长度为 2 的子串依次遍历,只要 s[i] 等于 s[i+1] ,它就是回文的,其长度为 2;接下来就好办了,长度大于 2 的子串,如果它要满足是回文子串的性质,就必须有 s[i] 等于 s[j] ,并且去掉两头的子串 s[i+1 … j-1] 也一定是回文子串,由于我们是从子问题依次增大求解的,所以求解 [i … j] 的问题时,比它规模更小的问题结果都是可以直接使用的了
C++代码如下:
class Solution { public: string longestPalindrome(string s) { int len = s.size(); int maxlen = 0; int start; bool p[1000][1000] = {false}; for (int i = 0; i<len;i++){ p[i][i] = true; if (i<len && s[i] == s[i+1]){ p[i][i+1] = true; maxlen = 2; start = i; } } for (int l = 3; l<len; l++){ for (int i = 0; i < len-l; i++){ int j = l+i-1; if (p[i+1][j-1] && s[i] == s[j]){ p[i][j] = true; maxlen = l; start = i; } } } if (maxlen > 2) return s.substr(start,maxlen); return NULL ; } };1d25c
相关文章推荐
- LeetCode 5. 最长回文子串(C++)
- @LeetCode最长回文子串--Longest Palindromic Substring[C++]
- [C++]LeetCode 5: Longest Palindromic Substring(最长回文子串)
- [C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)
- Leetcode(C++)——5. 最长回文子串
- 【LeetCode004-005算法/编程练习C++】--两个数组的中间数,找出最长回文子串
- leetcode(5)—— Longest Palindromic Substring(最长回文子串)
- leetcode-5. Longest Palindromic Substring(寻找最长回文子串)
- Leetcode(C++)——3. 无重复字符的最长子串
- leetcode 最长回文子串
- [leetcode]5. 最长回文子串
- 【LeetCode-面试算法经典-Java实现】【005-Longest Palindromic Substring(最长回文子串)】
- 转载:LeetCode:5Longest Palindromic Substring 最长回文子串
- Datawhale-LeetCode集训打卡-最长回文子串
- LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
- leetcode5-Longest Palindromic Substring(最长回文子串)
- LeetCode 5 最长回文子串 Manacher线性算法
- leetcode第五题求最长回文子串!!~~
- Leetcode 5. 最长回文子串
- leetcode之路--leetcode 5. 最长回文子串(1)