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.
思路一:这题首先想到的是递归求解,代码很简单,但是当测试样例很长时,超时,所以直接pass.
思路二:动态规划
用一个flag二维数组记录字符串子串是否回文的情况,flag[i][j]=true表示从字符串的i到j是回文。所以用双重循环,第一重循环从尾部开始往前扫描,假设当前位置为i,第二重循环从i+1往后扫描,这样可以直接利用前面记录的回文情况,只需要判定当前s[i]和s[j]是否相等。如果相等,则需要看flag[i+1][j-1]是否为true(why?因为i和j中间的字符串是i+1到j-1啊!),然后再判断是否更新结果。
对了,写完代码提交还有个小插曲,对测试样例(“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”)时间超时,想了还一会儿优化的方法,最后解决方案竟然是把if (flag[i + 1][j - 1] || j - i <= 2)这个或语句换一下顺序(这是换过的),OMG,这也是我想起了大一上C++课老师说的c++里面逻辑运算都是偷懒的,或运算只要有一个成立后面的条件就不判断了,这告诉我们好好听课的重要性!!!没换之前,j-i<=2大部分时间是不成立的,因此两个条件就老是要一起判断了,哎~
注:对动态规划不大清楚的,可以看看之前写的一篇背包问题,里面讲了动态规划的基本思想,还是很好理解的。
http://blog.csdn.net/andrewseu/article/details/50268987
class Solution {
public:
string longestPalindrome(string s) {
if (s.size() == 0)
return s;
bool flag[1000][1000];
int maxLen = 0;
string res = s.substr(0,1);
for (int i = 0; i < 1000; ++i){
for (int j = 0; j < 1000; ++j){
if (i == j)
flag[i][j] = true;//单个字符为回文
else
flag[i][j] = false;
}
}
for (int i = s.size() - 1; i >= 0; --i){
for (int j = i+1; j < s.size(); ++j){
if (s[i] == s[j]){
if (flag[i + 1][j - 1] || j - i <= 2){
flag[i][j] = true;
if (j - i + 1>maxLen){
maxLen = j - i + 1;
res = s.substr(i,maxLen);
}
}
}
else
flag[i][j] = false;
}
}
return res;
}
};