给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
解法一:暴力解法
列举所有情况需要O(n^2),判断是否回文需要O(n),所以暴力解法的时间复杂度是O(n^3)
解法二:动态规划
动态规划有两类题
- 计算某一个状态
- 统计多个状态
此题属于统计多个状态,定义i, j为子串范围,S[i, j]为子串
定义P(i, j)
状态转移方程:
边界条件(当n=1和n=2时):
具体做法:按长度遍历所有情况,取回文长度最大值为结果
动态规划优化了判断回文时的时间复杂度
解法三:中心扩展
动态规划的变体,遍历的方式不一样,从每一个字符向两边扩展,不需要O(n)的额外空间