题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
思路
一眼看上去就是动态规划,当然还有更快的方法,详见Manacher算法。
动态规划步骤
- 确定状态空间
- 确定状态转移函数,子状态的关系
- 遍历状态空间,填状态标注
- 得到结果
- 状态压缩,优化算法
本题思路
1. 确定状态空间
string s中的最长回文子串即确定s[i:j]是否是回文子串和回文串的长度。故可以用一个二维数组来记录状态dp[i][j]表示s[i:j]是否是回文子串和回文串的长度。
2. 确定状态转移函数
状态转移要划分出子状态。s[i:j]是否是回文子串 充要条件是 s[i+1:j-1]是回文且s[i] == s[j]。
映射到状态空间就是 dp[i+1][j-1]是字串 && s[i]==s[j]
状态转移函数是:
if (dp[i+1][j-1]==true && s[i]==s[j]){
dp[i][j] = true
} else {
dp[i][j] = false
}
3. 遍历状态空间,填状态标注
明确了状态转移函数就可以遍历状态空间来求解了。
如图沿对角线往右上角遍历解空间,依次填写dp[][]。

4. 得到结果
遍历完dp[][]就可以得到结果了。
5. 状态压缩,优化算法
遍历过程中有些情况是可以剪枝的,太麻烦了,不想改了。
代码
func longestPalindrome(s

该博客详细介绍了如何利用动态规划解决LeetCode上的第5题,即找到给定字符串中的最长回文子串。文章首先阐述了问题,然后逐步解析动态规划的思路,包括确定状态空间、状态转移函数、遍历并填充状态标注,以及状态压缩和算法优化。最后,提供了实现代码。
最低0.47元/天 解锁文章
252

被折叠的 条评论
为什么被折叠?



