- 中心扩展法
从中心向两侧扩展,分为两种情况:一种是奇数长度,一种是偶数长度,需要分开讨论。
class Solution {
public String longestPalindrome(String s) {
int n = s.length(), left = 0, right = 0;
for(int i = 0; i < s.length(); i++){
int l = i, r = i;
while(l > 0 && r < n-1 && s.charAt(l-1) == s.charAt(r+1)){
l--;
r++;
}
if(r-l > right-left){
right = r;
left = l;
}
l = i; r = i+1;
if(r == n || s.charAt(l) != s.charAt(r)) continue;
while(l > 0 && r < n-1 && s.charAt(l-1) == s.charAt(r+1)){
l--;
r++;
}
if(r-l > right-left){
right = r;
left = l;
}
}
return s.substring(left, right+1);
}
}
- dp
维护一个二维dp数组,对于一个回文子串来说,如果j-i < 2
,那么当i和j两个位置的字符相等的时候,是回文子串;如果j-i >= 2
,那么除了字符串相等这个条件外,还需要满足dp[i+1][j-1] == true
这个条件才能使字符串成为回文子串。
由于这里的i用到了i+1的状态,所以需要从后往前进行遍历。
class Solution {
public String longestPalindrome(String s) {
int n = s.length(), left = 0, right = 0;
boolean dp[][] = new boolean[n][n];
for(int i = n-1; i >= 0; i--){
for(int j = i; j < n; j++){
if(j-i < 2) dp[i][j] = s.charAt(i) == s.charAt(j);
else
dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j);
if(dp[i][j] && j-i > right-left){
left = i;
right = j;
}
}
}
return s.substring(left, right+1);
}
}
标签:子串,leetcode5,charAt,int,right,&&,回文,dp,left
From: https://www.cnblogs.com/xzh-yyds/p/16598397.html