[Leetcode] Longest Palindromic Substring

问题:

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代码如下:

 1 public class Solution {
 2     public String longestPalindrome(String s) {
 3         boolean[][] maxtrix = new boolean[s.length()][];
 4         int start = 0, end = -1, longest = 0;
 5         for(int i = s.length() -1; i >= 0; i--) {
 6             maxtrix[i] = new boolean[s.length()];
 7             for(int j = s.length() - 1; j >= i; j--) {
 8                 if(j - i == 0) {
 9                     maxtrix[i][j] = true;
10                 }else if(j - i == 1) {
11                     maxtrix[i][j] = s.charAt(i) == s.charAt(j);
12                 }else {
13                     maxtrix[i][j] = s.charAt(i) == s.charAt(j) && maxtrix[i + 1][j - 1];
14                 }
15                 if(j - i + 1 > longest && maxtrix[i][j]) {
16                     longest = j - i + 1;
17                     start = i;
18                     end = j;
19                 }
20             }
21         }
22         return s.substring(start, end + 1);
23     }
24 }

 

posted @ 2015-11-27 14:23  爪哇国臣民  阅读(138)  评论(0编辑  收藏  举报