题目:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
思路:
- 暴力求解,穷举,从头开始,长度增加,比较是否对称,O(N^3),肯定超时;
- 中心扩展法,因为自反字符串肯定是对称的,只要遍历一遍,每次以i为对称轴,向两边扩展看是否是自反字符串,考虑aba和bb奇偶情况。
/*//暴力求解,穷举,O(N^3)
public String longestPalindrome(String s) {
int n = s.length();
String t = "", max = "";
for(int i = 0; i < n; i++){
for(int j = i; j < n; j++){
boolean flag = true;
for(int k = 0; k <= (j-i)/2; k++){
if(s.charAt(i+k) != s.charAt(j-k)){
flag = false;
break;
}
}
if(flag){
t = s.substring(i, j+1);
if(t.length() > max.length()){
max = t;
}
}
}
}
return max;
}*/
//中心扩展法,遍历一遍,每次都往两边扩展,对称, O(N^2)
public String longestPalindrome(String s) {
int n = s.length();
String evenStr, oddStr, maxStr = "";
for(int i = 0; i < n; i++){
//考虑abc和bb这两种奇偶情况
evenStr = lengthOfPalindrome(s, i, i+1);
if(evenStr.length() > maxStr.length()){
maxStr = evenStr;
}
oddStr = lengthOfPalindrome(s, i-1, i+1);
if(oddStr.length() > maxStr.length()){
maxStr = oddStr;
}
}
return maxStr;
}
//扩展,检测自反
public String lengthOfPalindrome(String s, int i, int j){
int n = s.length();
while(i>=0 && j<n){
if(s.charAt(i) == s.charAt(j)){
i--;
j++;
}else{
break;
}
}
return s.substring(i+1, j);
}
- 动态规划,没搞懂。大意是用二维数组f[i][j]表示字符重复情况,i...j这段是回文串时,
这是一般的情况,由于需要依靠i+1, j -1,所以有可能 i + 1 = j -1, i +1 = (j - 1) -1,因此需要求出基准情况才能套用以上的公式:
a. i + 1 = j -1,即回文长度为1时,f[ i ][ i ] = true;
b. i +1 = (j - 1) -1,即回文长度为2时,f[ i ][ i + 1] = (s[ i ] == s[ i + 1])。