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.
Tags: String
容易想到的思路(可以解但会超时):
class Solution {
public:
string longestPalindrome(string s) {
int len = s.length();
for(int n=len; n>=; n--){
for(int i=; i<=len-n; i++){
if(isPalin(s.substr(i,n))){
return s.substr(i,n);
}
}
}
}
bool isPalin(string sub){
int len = sub.length();
for(int i=,j=len-; i<j; i++,j--){
if(sub[i]!=sub[j])
return false;
}
return true;
}
};
更好的思路:
上述思路相当于先构建一系列子字符串,然后分析每个子串是否回文数,这样将会有非常多的组合,计算复杂度高。这种思路其实是收缩的思路。
如果我们从前往后遍历,每次遍历到一个字符便以之为中心看能向两边扩散多远,从而形成一些列子串,如果形成的子串长度大于result,则更新result。这种思路是扩散的思路。
此题其实与LeetCode Algorithm 03有类似之处,即都不能直接构造固定长度字符串然后判断是否合乎要求。正确的做法都是先设定一个子串的出发点(端点或中心点),然后尽可能增长直到不满足条件,形成子串,然后更新原有的局部最佳子串,最终形成全局最长子串。
c++代码:
class Solution {
public:
string centerToOutside(string s, int left, int right){
while(left>= && right<=s.length()- && s[left]==s[right]){
left--;right++;
}
return s.substr(left+, right-left-);
} string longestPalindrome(string s) {
int len = s.length();
if(len == ){
return "";
}
string result = s.substr(,);
for(int i=; i<len-; i++){
string s1 = centerToOutside(s, i, i);
if(s1.length() > result.length()){
result = s1;
}
string s2 = centerToOutside(s, i, i+);
if(s2.length() > result.length()){
result = s2;
}
}
return result;
} };