leetcode 最长回文字串
最长回文字串递推公式
d
p
(
l
e
f
t
,
r
i
g
h
t
)
=
d
p
(
l
e
f
t
+
1
,
r
i
g
h
t
−
1
)
&
&
(
S
[
l
e
f
t
]
=
=
S
[
r
i
g
h
t
]
)
dp(left,right) = dp(left+1,right-1) \&\& (S[left]==S[right])
dp(left,right)=dp(left+1,right−1)&&(S[left]==S[right])
d
p
(
l
e
f
t
,
r
i
g
h
t
)
代
表
S
[
l
e
f
t
,
.
.
.
.
.
,
r
i
g
h
t
]
这
个
S
的
字
串
是
否
为
回
文
串
dp(left,right) 代表S[left,.....,right]这个S的字串是否为回文串
dp(left,right)代表S[left,.....,right]这个S的字串是否为回文串
边界条件为
r
i
g
h
t
−
l
e
f
t
<
3
right-left<3
right−left<3,代表二者index相邻或者间隔为一,则其为回文串,例如 aa,aba。
class Solution {
public String longestPalindrome(String s) {
int len = s.length();
if (len < 2) {
return s;
}
int maxLen = 1; //最大字串最少为1
int begin = 0;
// dp[i][j] 表示 s[i..j] 是否是回文串
boolean[][] dp = new boolean[len][len];
// 初始化:所有长度为 1 的子串都是回文串
for (int i = 0; i < len; i++) {
dp[i][i] = true;
}
char[] charArray = s.toCharArray();
//dp[left][right] 代表 s[left...right] 是否是回文串
for (int right = 1; right < len; right++) {
for (int left = 0; left < right; left++) {
if (charArray[right] != charArray[left]) { //字串两端不等,回文串。
dp[left][right] = false;
} else {
if (right - left < 3) { //若相等且二者index为 相邻或者隔一,则为回文串。例如 aa,aba.
dp[left][right] = true;
} else { //间隔大于1,由于两端相等,可递推
dp[left][right] = dp[left + 1][right - 1];
}
}
if (dp[left][right] && right - left + 1 > maxLen) {
maxLen = right - left + 1;
begin = left;
}
}
}
return s.substring(begin, begin + maxLen);
}
}