[LeetCode]05. Longest Palindromic Substring (动态规划),
分享于 点击 29593 次 点评:117
[LeetCode]05. 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.
Example:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example:
Input: "cbbd"
Output: "bb"
思路
- 简单描述:对于长度为n的字符串
s
,找出以第i
个字符起始的长度为len
的最长回文。(以下用s[i]
表示字符串s
的第i
个字符,0为起点) - 问题分割:要想知道长度为
len
的子串是否是回文,就要知道长度为len-2
的子串是否为回文。 - 子问题:
- 初始化:用矩阵
dp[i][j]
表示子串s[i]
到s[j]
是否是回文。是回文,dp[i][j]=true
,反之为false
。对于子问题1,给所有dp[i][i] (i∈[0,n-1])
赋值为true
。对于子问题2,给所有满足s[i]=s[i+1]
的dp[i][i+1](i∈[0,n-2])
赋值为true
。
代码
public class LongestPalindromicSubstring {
public String longestPalindrome(String s) {
boolean[][] dp = new boolean[s.length()][s.length()];
int left = 0;
int maxLen = 1;
// 初始化1.每个单字设置为true
for (int i = 0; i < s.length(); i++) {
dp[i][i] = true;
}
// 初始化2. 相邻的字符相等也是回文,设置为true
for (int i = 0; i < s.length() - 1; i++) {
if (s.charAt(i) == s.charAt(i + 1)) {
dp[i][i + 1] = true;
left = i;
maxLen = 2;
}
}
// 递推 寻找长度为3和3以上的回文子串
for (int len = 3; len <= s.length(); len++) { // 当前子串长度为len
for (int i = 0; i < s.length() - len + 1; i++) { // 当前子串起始位置i
int j = i + len - 1; // 子串尾端位置j. j-i=len-1
if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {
// if条件句解释: 1. 当前子串长度为3时, i+1=j-i=中间的字符
// 2. 当前子串长度为4时, i+1+1=j-i 即初始化2中检查相邻字符是否一样
// 也就是说,以每个字符为起始的每个长度的子串都做了判断,并将结果存储在了dp[][]中
// 下一轮长度+1时,可利用上一轮的判断结果
// 每一个字符,都遍历了长度1~n的子串,所以时间复杂度O(n^2)
dp[i][j] = true;
left = i;
maxLen = len;
}
}
}
return s.substring(left, left + maxLen);
}
}
参考
Longest Palindromic Substring
相关文章
- 暂无相关文章
用户点评