原题说明
Given a string s
, find the longest palindromic substring in s
. You may assume that the maximum length of s
is 1000.
Example 1:
Example 2:Input:
"babad"
Output:"bab"
Note:"aba"
is also a valid answer.
Input:
"cbbd"
Output:"bb"
解题思路
很多palindrome
相关的问题都可以用动态规划去解决. 做动态规划的问题, 要想清楚以下几件事情:
- 动归数组代表了什么
- 递推公式是什么, 从而可以决定从什么方向开始递推. 例如
dp[i] = func(dp[i-1])
那就从左向右递推, 反之如果dp[i] = func(dp[i+1])
那么就要从右向左递推 - 处理边界条件
回到这道题, 我们用一个二维布尔数组dp[j][i]
代表从j
开始到i
结束的子字符串是否为回文字符串. 初始条件为对于任意下标i
, dp[i][i]
为true
, 这一初始条件可以在递推过程中更新. 递推公式和递推方向请见具体代码.
示例代码 (cpp)
1 | class Solution { |
示例代码 (python)
1 | class Solution(object): |
复杂度分析
时间复杂度: O(n^2)
, 其中n
为s
的长度
空间复杂度: O(n^2)
归纳总结
动态规划的题一般思路比较难想清楚, 但是有了思路之后代码实现比较容易. 因此面试中不要慌张, 记住本文归纳的三个要点, 先讨论清楚了再开始写代码.