回文数分奇偶数长度两种情况:
奇数长度,以中间的字符为轴左右相等,判等从中间字符两侧的字符开始向左右展开。设此时轴为i
偶数长度,以中间两个字母的分界线为轴左右相等,判等从中间两个字符开始向左右展开。设此时轴为(i,i+1)
每次迭代以当前的字符 i 和 (i,i+1) 为轴进行判等,并试图更新最长子序列。这里找的是第一个,所以比原有的长才会更新。
判定回文数O(n),遍历O(n),总共O(n^2)。
class Solution {
public String returnPali(String s, int left, int right) {
while (left >= 0 && right <= s.length() - 1) {
if(s.charAt(left) == s.charAt(right)) {
--left;
++right;
}else{
break;
}
}
return s.substring(left + 1, right);
}
public String longestPalindrome(String s) {
if (s.isEmpty()) {
return null;
}
if (s.length() == 1) {
return s;
}
String ans = s.substring(0, 1);
for (int i = 0; i < s.length(); i++) {
String tmp = returnPali(s, i, i);
if (tmp.length() > ans.length()) {
ans = tmp;
}
tmp = returnPali(s, i, i + 1);
if (tmp.length() > ans.length()) {
ans = tmp;
}
}
return ans;
}
}