2023-08-20力扣今日二题

链接:

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

题意:

如题

解:

动态规划,枚举回文串中点并递增回文串长度

初始状态若L==R则单个字符为中点,需要添加0个字符成为回文串;若L+1==R则如果S[L]==S[R]则需要添加0个字符成为回文串,否则添加1个字符(选其一但是并不需要知道加的是那个)

状态转移:

如果S[L]!=S[R]DP[L][R] == min(dp[i + 1][j] + 1, dp[i][j - 1] + 1, dp[i + 1][j - 1]+1),但是dp[i + 1][j - 1]+1其实至少 等价于其中之一,比如abc需要添加a和c变成acbca或cabac,那么ab和bc都为1,abc+2==(ab+1)+1==(bc+1)+1;或者aac需要添加c,ac需要添加1,aa需要添加0,则aac+1==(aa)+1<=(ac+1)+1

如果s[L]==S[R],则DP[L][R]=min(DP[L][R],DP[L+1][R-1])

实际代码:

c++ 复制代码
#include<bits/stdc++.h>
using namespace std;
int minInsertions(string s)
{
    int lg=s.size();
    vector<vector<int>> dp(lg,vector<int>(lg,0x3f3f3f3f));
    for(int i=0;i<lg;i++) dp[i][i]=0;
    for(int t=1;t<lg;t++)//递增推导长度 
    {
        for(int i=0;i+t<lg;i++)//递增起点 
        {
            if(t==1)
            {
                if(s[i]==s[i+t]) dp[i][i+t]=0;
                else dp[i][i+t]=1;
            }
            else
            {
                dp[i][i+t]=min(dp[i][i+t-1]+1,dp[i+1][i+t]+1);
                if(s[i]==s[i+t]) dp[i][i+t]=min(dp[i][i+t],dp[i+1][i+t-1]);
            }
        }
    }
    return dp[0][lg-1];
}
int main()
{
    string s;cin>>s;
    int ans=minInsertions(s);
    cout<<ans<<endl;
    return 0; 
}

限制:

  • 1 <= s.length <= 500
  • s 中所有字符都是小写字母。
相关推荐
学高数就犯困32 分钟前
性能优化:LRU缓存(清晰易懂带图解)
算法
xlp666hub3 小时前
Leetcode第七题:用C++解决接雨水问题
c++·leetcode
CoovallyAIHub3 小时前
CVPR 2026 | MixerCSeg:仅2.05 GFLOPs刷新四大裂缝分割基准!解耦Mamba隐式注意力,CNN+Transformer+Mamba三
深度学习·算法·计算机视觉
CoovallyAIHub4 小时前
YOLO26-Pose 深度解读:端到端架构重新设计,姿态估计凭什么跨代领先?
深度学习·算法·计算机视觉
CoovallyAIHub4 小时前
化工厂气体泄漏怎么用AI检测?30张图3D重建气体泄漏场景——美国国家实验室NeRF新研究
深度学习·算法·计算机视觉
肆忆_4 小时前
实战复盘:手写 C++ 虚拟机的高性能并行 GC (Thread Pool + Work Stealing)
c++
肆忆_4 小时前
虚函数进阶答疑:把上一篇博客评论区里最容易卡住的问题,一次追到底
c++
颜酱16 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
saltymilk20 小时前
使用 C++ 模拟 ShaderLanguage 的 swizzle
c++·模板元编程
zone773921 小时前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试