前言
leetcode上第5题:最长回文子串的两种解法:第一种采用双指针从中间向两边同时分开的方式;第二种采用动态规划的方式。 (注:本文主要是自己的学习记录,并未对题目本身介绍的很详细)
一、双指针法
使用双指针法过程中遇见了两个问题:疏忽异常检测;忽略了指针最终指向位置并非回文子串实际位置。
下面是代码:
public String fun1(String s) {
if (s == null || s == "")
return null;
int maxLength = 0;
String result = null;
for (int i = 0; i < s.length(); i++) {
// 得到当前最大的回文子串(奇数)
int start = i, end = i;
result = currentPalindrom(maxLength, start, end, s, result);
// 得到当前最大的回文子串(偶数)
start = i;
end = i + 1;
if (end >= s.length())
break;
result = currentPalindrom(result.length(), start, end, s, result);
maxLength = result.length();
}
return result;
}
// 返回当前最长回文子串
String currentPalindrom(int maxLength, int start, int end, String s, String currentPalindrom) {
int length = s.length();
int currentL = 0;
while (s.charAt(start) == s.charAt(end)) {
if (start == end) {
currentL ++;
}
else{
currentL += 2;
}
start--;
end++; // end和start与每次的子串真正下标存在偏差,
// 子串真正范围是[start+1, end-1]
if (start < 0 || end >= length)
break;
}
if (currentL > maxLength) {
maxLength = currentL;
currentPalindrom = s.substring(start+1, end); //substring第二个参数需要往后多取一个数;
//由于在while循环中已经对越界问题进行了预处理,因此此处不会越界
}
// System.out.println(currentPalindrom);
return currentPalindrom;
}