力扣题解( 让字符串成为回文串的最少插入次数)

1312. 让字符串成为回文串的最少插入次数

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

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

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

思路:

本题要求的是最少插入次数,规定dp[i][j]是从i到j的最小插入次数,此时研究dp[i][j]的构成。

当i位置和j位置元素一致的时候,可以视为i+1,j-1范围的元素两边各加一个相同的值,则插入字符次数一样,因为可以看成在已经是回文的字串变成一个更长的字串。

当i位置和j位置不同时,此时可以分情况讨论,dp[i][j]的可能构成是对(i,j-1)的回文序列加上j位置元素,则只需要再加一即可构成新的回文序列(所加的就是一个j位置的数值),同理,也可能是(i-1,j)的回文序列再加上i位置元素,此时也是加一,也可能是(i+1,j-1)位置的回文序列,在两侧分别加一个元素(一个加i位置,一个加j位置),则dp[i][j]就是上述三种情况的最小值。

初始化时每个元素自己一定是回文,故均是0开局即可。

最后返回的是(0到n-1)位置的最小切割次数,故返回dp[0][n-1]即可。

复制代码
class Solution {
public:
    int minInsertions(string s) {
     int n=s.size();
     vector<vector<int>>dp(n,vector<int>(n,INT_MAX));
     for(int j=0;j<n;j++)
     {
        for(int i=j;i>=0;i--)
        {   
            int k=0;
            if(s[i]==s[j])
            {
                if(i+1<=j-1)
                {
                    k=dp[i+1][j-1];
                }
            }
            else
            {  
                if(i+1<=j-1)
                {   
                    k=min(dp[i+1][j-1]+2,min(dp[i+1][j]+1,dp[i][j-1]+1));
                }
                else
                k=1;
            }
            dp[i][j]=min(k,dp[i][j]);
        }
     }

     return dp[0][n-1];
    }
};
相关推荐
Greedy Alg7 小时前
LeetCode 239. 滑动窗口最大值
数据结构·算法·leetcode
空白到白7 小时前
机器学习-KNN算法
人工智能·算法·机器学习
闪电麦坤958 小时前
数据结构:排序算法的评判标准(Criteria Used For Analysing Sorts)
数据结构·算法·排序算法
爱coding的橙子8 小时前
每日算法刷题Day65:8.27:leetcode dfs11道题,用时2h30min
算法·leetcode·深度优先
不懂机器人8 小时前
linux网络编程-----TCP服务端并发模型(epoll)
linux·网络·tcp/ip·算法
Mercury_Lc9 小时前
【链表 - LeetCode】25. K 个一组翻转链表
数据结构·leetcode·链表
地平线开发者9 小时前
理想汽车智驾方案介绍 3|MoE+Sparse Attention 高效结构解析
算法·自动驾驶
小O的算法实验室10 小时前
2025年KBS SCI1区TOP,矩阵差分进化算法+移动网络视觉覆盖无人机轨迹优化,深度解析+性能实测
算法·论文复现·智能算法改进
艾莉丝努力练剑11 小时前
【C语言16天强化训练】从基础入门到进阶:Day 11
c语言·学习·算法
浩少70213 小时前
LeetCode-22day:多维动态规划
算法·leetcode·动态规划