Longest Palindromic Substring
问题描述
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: “babad”
Output: “bab”
Note: “aba” is also a valid answer.
Example:
Input: “cbbd”
Output: “bb”
算法思路
主要是使用了动态规划的思想:
1. 设
s
为输入的字符串,长度为len。
2. 设一个布尔矩阵
3. 因为当个字符必然是回文,所以所有
并且记录目前回文的起始位置 i 。
4. 目前矩阵
。
1. 若字符 s[i] 与字符 s[j] 相同,且子字符串 i+1 到 j−1 为回文,既 p[i+1][j−1]=true ,则更新begin与maxl。
2. 否则,不更新。
5. 当遍历完所有的长度 l <script id="MathJax-Element-20" type="math/tex">l</script>后,就可以得到最长回文子串的起始位置与长度了。
算法代码
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
int begin = 0;
int maxl = 1;
bool p[1000][1000] = {false};
for (int i = 0; i < len; ++i){
p[i][i] = true;
}
for(int i = 0 ; i < len - 1;i++){
if(s[i] == s[i + 1]){
p[i][i + 1] = true;
begin = i;
maxl = 2;
}
}
for(int l = 3; l <= len; l++){
for(int i = 0 ; i < len - l + 1;i++){
int j = i + l - 1;
if(s[i] == s[j] && p[i + 1][j - 1]){
p[i][j] = true;
begin = i;
maxl = l;
}
}
}
return s.substr(begin,maxl);
}
};
感想
该题目使用了动态规划的思想,只要弄清了状态转移方程,就可以根据一些“显而易见”的结果推得最终的最优结果。