您的位置:首页 > 其它

[Leetcode] Longest Palindromic Substring

2015-11-27 14:23 309 查看
问题:

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.

假设 f(i, j) 表示字符串S中下标从i到j的子串是否为回文,其值为true或false,那么用如下的公式来递归计算所有i,j组合的f(i, j):

我们只考虑i <= j 的情形

如果i == j, 那么 f(i, j) 表示S中只包含一个字符的子串是否为回文,这个子串肯定是回文,因此 f(i, j) =
true;

如果i + 1 = j, 那么 f(i, j) 表示S中只包含前后相邻的两个字符的子串是否为回文,因此其值又这两个字符是否相等决定,
即 f(i, j) = S.charAt(i) == S.charAt(j).

如果i + 1 < j, 那么 f(i, j)
表示S中至少包含三个字符的子串是否为回文,这时如果i处的字符等于j处的,并且夹在它们之间的子串也是回文的话,那么该子串就也是回文,否则就不是。因此,

f(i, j) = S.charAt(i) == S.charAt(j) && f(i + 1, j -
1).

总结一下,

当i == j时,f(i, j) = true

当i + 1 = j时,f(i, j) = S.charAt(i) == S.charAt(j)

当i + 1 < j时,f(i, j) = S.charAt(i) == S.charAt(j) && f(i
+ 1, j - 1)

根据这个公式,计算所有f(i, j)并在计算过程中记录最长子串的长度和起始位置。



Java代码如下:

public class Solution {
public String longestPalindrome(String s) {
boolean[][] maxtrix = new boolean[s.length()][];
int start = 0, end = -1, longest = 0;
for(int i = s.length() -1; i >= 0; i--) {
maxtrix[i] = new boolean[s.length()];
for(int j = s.length() - 1; j >= i; j--) {
if(j - i == 0) {
maxtrix[i][j] = true;
}else if(j - i == 1) {
maxtrix[i][j] = s.charAt(i) == s.charAt(j);
}else {
maxtrix[i][j] = s.charAt(i) == s.charAt(j) && maxtrix[i + 1][j - 1];
}
if(j - i + 1 > longest && maxtrix[i][j]) {
longest = j - i + 1;
start = i;
end = j;
}
}
}
return s.substring(start, end + 1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: