题目描述:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
大意:返回最长回文字符串
解题思路:
1,动态规划(dp),假如substr(i,len)是最长回文字符串(用一个bool型二维数组来判断表示),那么左右两端向内移动一位,必须同样满足回文字符串的条件。
2,遍历整个长度,因为你不能确定当前是否最长,直至最后遍历完毕
3,设定了字符串长度为len,那么这个len必须是1到s.size();len很重要,因为它决定了两者:起始字符串下表i(最大只能为s.size()-len-1),还有当前长度的最后一位下标j(i+len-1)
代码部分:
class Solution {
public:
string longestPalindrome(string s) {
if(s.length()<=1)
return s;
int slen=s.length();
bool table[1000][1000]={false};
int maxlen=1;
int start=0;
for(int i=0;i
<.cause the s.length(),could be slen,only j should be slen-1
{
for(int i=0;i
代码分析:1,起初我不知道为什么len必须从3开始循环,而把len=1,len=2作为基础,就把len=2的情况注释,然后大循环从len=2开始,但是出现错误。现在明白了:动态规划都必须有base,基础情况,所有问题都必须能一步步分割到最后,也就是分割到base,和斐波那契数列一样(当前数值等于前两者之和,所以必须有n=1,n=2),最长字符串长度不知奇偶性,所以分割到最后,不知道是否为一个char(奇数)或者两个char(偶数),例如abb,分割到最后应该是s[1]=s[2];又例如aba,分割到最后,应该是s[1]=s[1].
2,另外一个问题是大循环里面的一个判断条件,s[i]==s[j]&&table[i+1][j-1],想着第二个table的条件是否能换为s[i+1]==s[j-1],答案是否定的。因为table的含义是ij之内的字符串为回文,而不是单独判断两端的元素。