Longest Palindromic Substring , Leetcode

来源:互联网 发布:淘宝店铺产品布局 编辑:程序博客网 时间:2024/06/03 22:01

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length ofS is 1000, and there exists one unique longest palindromic substring.

求最长回文子串。

看到这题一瞬间就想到了动态规划,感觉上和求最长公共子序列是异曲同工的。

大二的时候算法这门课用的教材是《计算机算法设计与分析》,第四版,王晓东,电子工业出版社,当时学习动态规划的第一个例子是矩阵连乘问题,所以这题代码的一些细节与书中给出的代码是很相似的。

还是先上代码,通过了 Online Judge,第一次提交的时候超时了,想了一会原样再提交了一次,结果通过了。。。

public String longestPalindrome(String s) {String result = s;int l = s.length();char[] c = new char[l];c = s.toCharArray();boolean[][] b = new boolean[l][l];for(int i = 0;i < l;i++) {b[i][i] = true;}for(int i = 0;i < l - 1;i++) {if(c[i] == c[i + 1]) {b[i][i + 1] = true;}else {b[i][i + 1] = false;}}for(int j = 2;j < l;j++) {for(int i = 0;i < l - j;i++) {if(b[i + 1][i + j - 1] == true && c[i] == c[i + j]) {b[i][i + j] = true;}else {b[i][i + j] = false;}}}    loop :for(int i = l - 1;i >= 0;i--) {for(int j = 0;j < l - i;j++) {if(b[j][j + i] == true) {result = s.substring(j, j + i + 1);break loop;}}}return result;}

先定义一个布尔类型的二维数组,b[i][j]为true表示从s[i] 到 s[j]这个子串是回文的。

我们先把这个数组 i <= j 的部分填满

s[i][i],必须都是true

s[i][i + 1],如果这两个数相等,true,否则false

s[i][i + 2],如果s[i]等于s[i + 2],true

s[i][i + 3],如果s[i]等于s[i + 3]并且s[i + 1]等于s[i + 2],true

s[i][i + 4],如果s[i]等于s[i + 4],并且中间的3个数是回文的,true

可以得到规律,从s[i][i + 2]开始,只要首尾两数相等,且中间是回文的,则true

这样的操作,相当于把所有的子串,根据长度由小至大遍历了一遍,所以在判断较长的子串是否回文时,这个子串掐头去尾之后剩下的子串一定是已经判断过的。

完成这个二维数组后,只需找到 j - i 最大的true,返回对应子串即可


0 0
原创粉丝点击