Given a string s, return the longest palindromic substring in s.
Example 1:
Input: s = "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: s = "cbbd"
Output: "bb"
Example 3:
Input: s = "a"
Output: "a"
Example 4:
Input: s = "ac"
Output: "a"
Constraints:
1 <= s.length <= 1000
s consist of only digits and English letters (lower-case and/or upper-case),
实现思路:
本题的方法有很多,其中暴力方法肯定是最差的,还有就是采用动态规划的方法,这里笔者用的是中心扩散方法去实现,具体方法就是每到一个字符就向两边进行延伸张,其中延伸的情况有奇延伸和偶延伸,具体的情况就是中心结点是一个和中心结点为两个的情况:
如果是总结点数为奇数的回文子串那么只有对称中心的结点是不同的,但总结点为偶数的回文子串那则是所有两边的结点都是对称的。
AC代码:
class Solution {
string findAns(string s,int left,int right) {
int i=left,j=right,size=s.length();
while(i>=0&&j<size) {//进行中心扩散的策略
if(s[i]==s[j]) {
i--;//向两边扩散
j++;
} else break;
}
return s.substr(i+1,j-i-1);
}
public:
string longestPalindrome(string s) {
int size=s.length();
if(size<2) return s;
string ans;
for(int i=0; i<size-1; i++) {
string odd=findAns(s,i,i),even=findAns(s,i,i+1);//同时进行奇扩散和偶扩散
string res=odd.size()>even.size()?odd:even;//保存奇扩散和偶扩散中得到长度较大的回文串
if(res.size()>ans.size()) {
ans=res;
}
}
return ans;
}
};