当前位置: 首页 > news >正文

动态规划——回文串问题

目录

1. 回文子串

2. 最长回文子串 

3. 回文串分割

4. 分割回文串II

5. 最长回文子序列 

6. 让字符串成为回文串的最小插入次数 


1. 回文子串

题目链接:647. 回文子串 - 力扣(LeetCode)

题目展示:

题目分析:

代码实现:

class Solution {
public:
    int countSubstrings(string s) 
    {
        int n=s.size();
        vector<vector<bool>> dp(n,vector<bool>(n));
        int ret=0;
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j]) dp[i][j]=i+1<j?dp[i+1][j-1]:true;
                if(dp[i][j]) ret++;
            }
        }
        return ret;
    }
};

2. 最长回文子串 

题目链接:5. 最长回文子串 - 力扣(LeetCode)

题目展示:

题目分析:

代码实现:

class Solution {
public:
    string longestPalindrome(string s) 
    {
        int n=s.size();
        vector<vector<bool>> dp(n,vector<bool>(n));
        int len=1,begin=0;
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j]) dp[i][j]=i+1<j?dp[i+1][j-1]:true;
                if(dp[i][j]&&j-i+1>len) len=j-i+1,begin=i;
            }
        }
        return s.substr(begin,len);
    }
};

3. 回文串分割

题目链接:1745. 分割回文串 IV - 力扣(LeetCode)

题目展示:

题目分析:

这道题看起来比较困难,实际上并不难,我们利用前面动态规划的思想可以瞬间降这道题变得简单。

代码实现:

class Solution {
public:
    bool checkPartitioning(string s) 
    {
        int n=s.size();
        vector<vector<bool>> dp(n,vector<bool>(n));
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j])
                {
                    dp[i][j]=i+1<j?dp[i+1][j-1]:true;   
                }
            }
        }
        for(int i=1;i<n-1;i++)
        {
            for(int j=i;j<n-1;j++)
            {
                if(dp[0][i-1]&&dp[i][j]&&dp[j+1][n-1]) return true;
            }
        }
        return false;
    }
};

4. 分割回文串II

题目链接:132. 分割回文串 II - 力扣(LeetCode)

题目展示:

题目分析:

代码实现:

class Solution {
public:
    int minCut(string s) 
    {
        int n=s.size();
        vector<vector<bool>> isPal(n,vector<bool>(n));
        for(int i=n-1;i>=0;i--)
        {
            for(int j=i;j<n;j++)
            {
                if(s[i]==s[j])
                {
                    isPal[i][j]=i+1<j?isPal[i+1][j-1]:true;
                }
            }
        }
        vector<int> dp(n,INT_MAX);
        for(int i=0;i<n;i++)
        {
            if(isPal[0][i]) dp[i]=0;
            else
            {
                for(int j=1;j<=i;j++)
                {
                    if(isPal[j][i]) dp[i]=min(dp[i],dp[j-1]+1);
                }
            }
        }
        return dp[n-1];
    }
};

5. 最长回文子序列 

题目链接:516. 最长回文子序列 - 力扣(LeetCode)

题目展示:

题目分析:

说明:填表顺序那里笔误,应该是从下往上填每一行。 

代码实现:

class Solution 
{
public:
    int longestPalindromeSubseq(string s) 
    {
        int n=s.size();
        //创建dp表
        vector<vector<int>> dp(n,vector<int>(n));
        //本题无需初始化
        //填表
        for(int i=n-1;i>=0;i--)
        {
            dp[i][i]=1;
            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][j-1],dp[i+1][j]);
            }
        }
        //返回值
        return dp[0][n-1];
    }
};

6. 让字符串成为回文串的最小插入次数 

题目链接:1312. 让字符串成为回文串的最少插入次数 - 力扣(LeetCode)

题目展示:

题目分析:

代码实现:

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

相关文章:

  • 第32周Java微服务入门 微服务基础
  • 【Nova UI】三、探秘 BEM:解锁前端 CSS 命名的高效密码
  • 不带头结点的单链表插入方法(头插法与尾插法)
  • 嵌入式学习笔记-FLASH,CPU,MPU,MCU,SOC,SOPC,架构,流水线,RAM和ROM,交叉编译
  • 数据治理的专题库
  • uni-app-监控网络请求 插件 - uninetconsoledayer
  • 第十章 文件和异常
  • XPath语法完全指南(实战详解版)
  • Rust闭包详解
  • 模型无法正确进行计算,以复利计算为实例
  • 【Easylive】分片上传视频文件 uploadVideo方法
  • TCP、流量控制、滑动窗口、拥塞控制等
  • 复杂的数据类型04--对象的基础:结构
  • Linux_3.2
  • 力扣刷题————199.二叉树的右视图
  • 【深度学习】处理crowdhuman数据集
  • Turtle综合案例实战(绘制复杂图形、小游戏)
  • CSS3:Flex简记
  • RCU机制以及内存优化屏障
  • VAE 详解
  • jmail官方网站/房地产十大营销手段
  • 建设网站实训报告书/怎么做百度推广运营
  • 网站下拉菜单设计/商丘网站优化公司
  • 盘石 网站建设/博客网站注册
  • 衣服网站建设方案/最新黑帽seo培训
  • 大型网站 中小型网站/g3云推广靠谱吗