代码地址(在力扣运行均已通过)
https://github.com/tomjerry99/algorithm_leetcode
题目 (https://leetcode-cn.com/problemset/all/)
5.最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
1.暴力法。遍历整个字符串,对每个位置index,判断当前从0到index是否存在回文,时间复杂度为o(n3)。
2.动态规划。根据在这个文章里提到的解法,我们继续用四个步骤来分析。寻找状态
通过分析回文字符串的特性,我们可以发现对于bab
来说,因为字符a是回文,如果最外层的两个字符相等,那bab一定就是回文。同样对于cbabc
来说,要判断是否是回文,我们已经知道bab是回文,如果最外层两个字符串相等,那么该字符就一定是回文。由此我们发现了他们之间的关系,那就是最外层字符的状态依赖于内层。
状态转移方程
用i
代表当前字符串的位置,j
代表最末字符串的位置,判断i~j
是回文,只需要判断str[i]=str[j],并且str[i+1]~str[j-1]是回文即可
。我们用dp[i][j] = true