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"他人思路:
声明布尔类型二维数组,行和列分别代表字符串中每个字符所在的位置,用于存储行所代表的字符到列所代表的字符是否为回文子串。单循环设定所有单字符都是回文;然后单循环判断相邻两个字符是否是回文;最后双循环判断三个以上字符是否回文,外循环不断增加长度,内循环判断如果两字符相同则等于数组左下角的布尔值,如图所示:
如果符合条件,则红字部分等于黄字部分的布尔值代码(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;
}
}
给定一个字符串 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"他人思路:
声明布尔类型二维数组,行和列分别代表字符串中每个字符所在的位置,用于存储行所代表的字符到列所代表的字符是否为回文子串。单循环设定所有单字符都是回文;然后单循环判断相邻两个字符是否是回文;最后双循环判断三个以上字符是否回文,外循环不断增加长度,内循环判断如果两字符相同则等于数组左下角的布尔值,如图所示:
1 | 2 | 3 | 4 | |
1 | true | true | ||
2 | true | |||
3 | true | |||
4 | true |
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题库解答与分析——#3.无重复字符的最长子串LongestSubstringWithoutRepeatingCharacters
- [C++]LeetCode 5: Longest Palindromic Substring(最长回文子串)
- 【LeetCode】Longest Palindromic Substring && 【九度】题目1528:最长回文子串(腾讯2013年实习生招聘二面面试题)
- LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
- 最长回文子串-LeetCode 5 Longest Palindromic Substring
- Longest Palindromic Substring [LeetCode] 最长回文子串
- LeetCodeOJ_5_m_Longest Palindromic Substring(最长回文子串)
- leetcode (5) - Longest Palindromic Substring 最长回文子串
- LeetCode Longest Palindromic Substring 最长回文子串
- LeetCode-5-Longest Palindromic Substring 最长回文子串DP
- [LeetCode]—Longest Palindromic Substring 最长回文子串
- LeetCode:Longest Palindromic Substring 最长回文子串
- [LeetCode] Longest Palindromic Substring 最长回文子串
- Longest Palindromic Substring 在一个字符串里找最长回文子串@LeetCode
- LeetCode:Longest Palindromic Substring 最长回文子串
- LeetCode---5. Longest Palindromic Substring(最长回文子串)
- LeetCode 5 Longest Palindromic Substring(最长回文子串,暴力剪枝/DP/曼彻斯特算法)
- LeetCode 5. Longest Palindromic Substring(最长回文子串)
- [C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)
- LeetCode | Longest Palindromic Substring(最长回文子串)