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 分钟前
大三备战考研 + 找实习:我整理了 20 道必会的时间复杂度题(建议收藏)
算法·408·计算机考研
lizhongxuan1 小时前
AI小镇 - 涌现
算法·架构
AI工程架构师4 小时前
通常说算力是多少 FLOPS,怎么理解,GPU和CPU为什么差异这么大
算法
不想写代码的星星5 小时前
C++继承、组合、聚合:选错了是屎山,选对了是神器
c++
祈安_5 小时前
Java实现循环队列、栈实现队列、队列实现栈
java·数据结构·算法
归去_来兮18 小时前
拉格朗日插值算法原理及简单示例
算法·数据分析·拉格朗日插值
千寻girling1 天前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
颜酱1 天前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
不想写代码的星星1 天前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++
CoovallyAIHub2 天前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉