最开始采用的是动态规划的方法,但是超时。后来上网查了下,找到了以下这种方法。分为aa和aba两种情况考虑,以每一个字符为中心判断其为中心的时候得到的最长回文串。同动态规划相比,这种方法在发现不是回文的时候就会返回,而不像动态规划严格执行n*n.的时间,会快很多。
代码的思路很简单,实现起来也不难,就
lass Solution {
public:
string findPal(string &s, int left, int right)
{
if (left < 0)
return s.substr(left+1, 1);
if (right >= s.size())
return s.substr(right-1, 1);
while(0 <= left && right < s.size())
{
if (s[left] != s[right])
break;
left--;
right++;
}
left++;
right--;
return s.substr(left, right - left + 1);
}
string longestPalindrome(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (s.size() == 0)
return "";
string ret;
for(int i = 0; i < s.size(); i++)
{
string str = findPal(s, i - 1, i + 1);
if (str.size() > ret.size())
ret = str;
str = findPal(s, i, i + 1);
if (str.size() > ret.size())
ret = str;
}
return ret;
}
};
直接把对方的代码搬上来了,多多学习,多多参考。