您的位置:首页 > 编程语言 > PHP开发

LeetCode题库解答与分析——#5.最长回文子串LongestPalindromicSubstring

2018-03-11 23:00 471 查看
#5 最长回文子串 Longest Palindromic Substring

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 长度最长为1000。

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

示例:输入: "babad"

输出: "bab"

注意: "aba"也是有效答案
示例:输入: "cbbd"

输出: "bb"他人思路:
声明布尔类型二维数组,行和列分别代表字符串中每个字符所在的位置,用于存储行所代表的字符到列所代表的字符是否为回文子串。单循环设定所有单字符都是回文;然后单循环判断相邻两个字符是否是回文;最后双循环判断三个以上字符是否回文,外循环不断增加长度,内循环判断如果两字符相同则等于数组左下角的布尔值,如图所示:

 1234
1truetrue 
2true  
3  true 
4   true
如果符合条件,则红字部分等于黄字部分的布尔值代码(Java):class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() < 2) {
return s;
}

int maxLength = 0;
String longest = null;

int length = s.length();
boolean[][] table = new boolean[length][length];

// 单个字符都是回文
for (int i = 0; i < length; i++) {
table[i][i] = true;
longest = s.substring(i, i+1);
maxLength = 1;
}

// 判断两个字符是否是回文
for (int i = 0; i < length - 1; i++) {
if (s.charAt(i) == s.charAt(i + 1)) {
table[i][i+1] = true;
longest = s.substring(i, i + 2);
maxLength = 2;
}
}

// 求长度大于2的字串是否是回文串
for (int len = 3; len <= length; len++) {
for (int i = 0, j; (j = i + len - 1) <= length - 1; i++) {
if (s.charAt(i) == s.charAt(j)) {
table[i][j] = table[i + 1][j - 1];
if(table[i][j] && maxLength < len) {
longest = s.substring(i, j + 1);
maxLength = len;
}
}else {
table[i][j] = false;
}
}
}

return longest;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode 算法