正确的做法是backtrack. 回文判断从中间判断比较划算,因为一旦失败,就没有继续往外判断的意义了,可以back track。
所以就遍历,从遍历的位置为中心往两边判断。
需要注意,ABA ABBA这俩都算回文,第一个中心是B,第二个是BB(也可以看做是BB之间的空隙)。
所以遍历的时候,每个位置要先以当前字母为中心,再以当前字母和他右边那个为中心。。
class Solution {
public String longestPalindrome(String s) {
if(s.length()==1)return s;
int max=0;
String res=new String();
for (int i=0;i<s.length();i++){
int L=i;//aba
int R=i;
String temp=getPlength(s,L,R);
if(temp.length()>max){
max=temp.length();
res=temp;
}
if(i !=s.length()-1){
L=i;R=i+1;//abba
temp=getPlength(s,L,R);
if (temp.length()>max){
max=temp.length();
res=temp;
}
}
}
return res;
}
private String getPlength(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);
}
}
扫一遍,每个位置找可能符合的最长回文。
分别以单字符和双字母作为中心都试试,然后更新就行了。
Time: O(n^2)
Space: O(n)
public class Solution {
public String longestPalindrome(String s) {
if (s.length() <= 1) return s;
String res = "";
for (int i = 0; i < s.length(); i++) {
int l = i;
int r = i;
String temp = getString(s, l, r);
if (temp.length() > res.length()) {
res = temp;
}
r = i + 1;
temp = getString(s, l, r);
if (temp.length() > res.length()) {
res = temp;
}
}
return res;
}
public String getString(String s, int l, int r) {
while (l >= 0 && r < s.length()) {
if (s.charAt(l) != s.charAt(r)) {
break;
} else {
r++;
l--;
}
}
return s.substring(l+1, r);
}
}