给你一个字符串 s,找到 s 中最长的回文子串。
双指针样例分析:输入s=acaba,那么算法应该要返回aca或者aba
当拿到题目没有思路的时候,不妨先从局部入手,从局部逐步推导达到最优解
s',然后在s和s'中寻找最长公共子串,这样应该就能找到最长的回文子串
存在于raw字符串中的回文子串,一定也存在于raw'之中,而且两者一模一样aacxycaa,它反转之后是aacyxcaa,我们使用算法寻找出其最长公共子串是aac或者caa从中间开始向两边扩散来判断回文串for(int i = 0;i<s.length();i++){
//找到以s[i]为中心的会问串
//根据找到的回文串长度来更新答案
}
for(int i = 0;i<s.length();i++){
//找到以s[i]为中心的回文串
//找到以s[i]和s[i+1]为中心的回文串[i+1]可能越界
//更新答案
}
public String longestPalindrome(String s) {
String res = "";
for(int i = 0;i<s.length();i++){
String s1 = palindrome(s, i, i);
String s2 = palindrome(s, i, i + 1);
res = res.length()>s1.length()?res:s1;
res = res.length()>s2.length()?res:s2;
}
return res;
}
//从s[l]和s[r]开始向两端扩散
//返回以s[l]和s[r]为中心的最长回文串
//同时传入l和r,便于处理中心点不在同一个点的情况
//当l和r相等的时候,就是在寻找长度为奇数的回文串
//当r=l+1的时候,就是在寻找长度为偶数的回文串
private String palindrome(String s,int l,int r){
//防止索引越界
while (l>=0 && r<s.length() && s.charAt(l) == s.charAt(r)){
l--;r++;
}
return s.substring(l+1,r);
}