【区间DP】【hard】力扣1312. 让字符串成为回文串的最少插入次数

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

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

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

示例 1:

输入:s = "zzazz"

输出:0

解释:字符串 "zzazz" 已经是回文串了,所以不需要做任何插入操作。

示例 2:

输入:s = "mbadm"

输出:2

解释:字符串可变为 "mbdadbm" 或者 "mdbabdm" 。

示例 3:

输入:s = "leetcode"

输出:5

解释:插入 5 个字符后字符串变为 "leetcodocteel" 。

提示:

1 <= s.length <= 500

s 中所有字符都是小写字母。

csharp 复制代码
class Solution {
public:
    int minInsertions(string s) {
        int n = s.size();
        vector<vector<int>> dp(n, vector<int>(n));
        for(int i = 0; i < n; i++){
            dp[i][i] = 1;
        }

        for(int i = n - 2; i >= 0; i--){
            for(int j = i + 1; j < n; j++){
                if(s[i] == s[j]){
                    dp[i][j] = dp[i+1][j-1] + 2;
                }
                else{
                    dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
                }
            }
        }
        return n - dp[0][n-1];
    }
};

我们转变思路,要找到最少插入次数,实际上就是要找最长的回文子序列的长度是多少,然后剩下的字符我们就需要插入字符配对构成回文串。具体过程参考主页力扣516题解。

相关推荐
满怀冰雪4 分钟前
第14篇-队列与单调队列-解决窗口最值问题的关键结构
java·算法
QiLinkOS7 分钟前
极客精神与商业思维的融合实践(3)
c语言·c++·人工智能·算法·开源协议
bIo7lyA8v9 分钟前
算法设计中的代价函数优化与约束求解的技术8
算法
暖阳华笺12 分钟前
【数据结构与算法】哈希专题
数据结构·c++·算法·leetcode·哈希算法
ceclar12313 分钟前
C#字节流与字符流
算法·c#·.net
大白话_NOI18 分钟前
【洛谷 P1024 】[NOIP2001 提高组] 一元三次方程求解 - 详细分析与C++实现
c++·算法
Matthew_zhu_19 分钟前
P3374 【模板】树状数组 1 题解
算法
随意起个昵称19 分钟前
区间dp-进阶题目1(进阶合并)
c++·算法·动态规划
伶俜6620 分钟前
鸿蒙原生应用实战(四)ArkUI 语音变声器:录音 + 4 种音效 + 音调变换算法
算法·华为·harmonyos
AKA__Zas24 分钟前
芝士算法(滑动窗口片 2.0)
java·算法·leetcode·学习方法