LeetCode 1312. 让字符串成为回文串的最少插入次数(区间DP)

    科技2022-08-07  105

    文章目录

    1. 题目2. 解题

    1. 题目

    给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。

    请你返回让 s 成为回文串的 最少操作次数 。

    「回文串」是正读和反读都相同的字符串。

    示例 1: 输入:s = "zzazz" 输出:0 解释:字符串 "zzazz" 已经是回文串了,所以不需要做任何插入操作。 示例 2: 输入:s = "mbadm" 输出:2 解释:字符串可变为 "mbdadbm" 或者 "mdbabdm" 。 示例 3: 输入:s = "leetcode" 输出:5 解释:插入 5 个字符后字符串变为 "leetcodocteel" 。 示例 4: 输入:s = "g" 输出:0 示例 5: 输入:s = "no" 输出:1 提示: 1 <= s.length <= 500 s 中所有字符都是小写字母。

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-insertion-steps-to-make-a-string-palindrome 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    2. 解题

    类似题目: LeetCode 5. 最长回文子串(动态规划) LeetCode 647. 回文子串(DP) LeetCode 1216. 验证回文字符串 III(DP) LeetCode 516. 最长回文子序列(动态规划)

    dp[i][j] 区间 [i,j] 变成回文的最少操作次数 class Solution { public: int minInsertions(string s) { int n = s.size(); vector<vector<int>> dp(n,vector<int>(n, 0)); for(int i = 1; i < n; i++) { if(s[i-1] != s[i])//初始化 dp[i-1][i] = 1; } for(int len = 2; len < n; len++) { for(int i = 0; i+len < n; i++) { int j = i+len; if(s[i]==s[j]) dp[i][j] = dp[i+1][j-1]; else { dp[i][j] = min(2+dp[i+1][j-1], 1 + min(dp[i+1][j], dp[i][j-1])); } } } return dp[0][n-1]; } };

    88 ms 26.6 MB


    我的博客地址 https://michael.blog.csdn.net/

    长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

    Processed: 0.009, SQL: 8