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

动态规划-回文串问题——647.回文子串

1.题目解析

题目解析:647.回文子串——力扣

测试用例

2.算法原理  

1.状态表示

本题需要判断一段字符串是否为回文子串,因此最简单的方法就是保存起开始位置与结束位置,那么就需要一个二维的dp表来保存一段字符串是否为回文子串,dp表的数据类型为bool类型

dp[i][j]:以第i个位置开始,第j个位置结束的字符串是否为回文子串,是则为true,反之为false

2.状态转移方程

由于回文子串需要中心对称,因此判断完两端则需要向中间判断,也就是dp[i][j] = dp[i+1][j-1],但是注意单个字符串与两个相同字符串的情况,这两种情况一定为回文子串,所以在判断前想确定此时的i+1<j是否成立,即一定保证要长度大于3,小于3就一定为true

状态转移方程为:if(s[i]==s[j])  dp[i][j] = i+1 < j ? dp[i+1][j-1] : true;

3.初始化

一开始就确定了单个字符与两个连续字符的情况,所以不用初始化

4.填表顺序

因为用到了i+1与j-1位置,根据状态表示的图示可以知道需要从下向上填表也就是i从后向前,j一定大于i小于n

5.返回值

返回dp表中true的个数

3.实战代码

代码解析 

class Solution {
public:
    int countSubstrings(string s) 
    {
        int n = s.size();
        int sum = 0;
        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;
                }
                if(dp[i][j])
                {
                    sum++;
                }
            }
        }    
        return sum;
    }
};


http://www.kler.cn/a/373608.html

相关文章:

  • sql模糊关联匹配
  • 【文件锁】多进程线程安全访问文件demo
  • 【Redis学习 | 第5篇】Redis缓存 —— 缓存的概念 + 缓存穿透 + 缓存雪崩 + 缓存击穿
  • Wi-Fi Direct (P2P)原理及功能介绍
  • Go语言之路————go环境的初始化
  • 【NLP】ELMO、GPT、BERT、BART模型解读及对比分析
  • 奥数与C++小学四年级(第十一题 试商)
  • unseping攻防世界
  • 推荐:自然语言处理方向的一些创新点
  • 基于SSM+微信小程序的跑腿平台管理系统(跑腿3)
  • [OceanBase-不止于记录]:揭秘双引擎战略,共探AI时代数据架构未来
  • 聚水潭数据集成MySQL:高效组合装商品查询案例
  • 文心一言 VS 讯飞星火 VS chatgpt (381)-- 算法导论24.5 1题
  • 机器学习算法工程师笔试选择题(2)
  • 前端文件上传组件流程的封装
  • OpenGL入门001——使用glad和glfw创建一个窗口
  • 为什么 C 语言数组是从 0 开始计数的?
  • Cursor的composer和chat的应用
  • 荣耀独立四周年:以己之名,终至海阔天空
  • 串口通信以及USART和UART以及IIC和SPI-学习笔记
  • Java 开发——(下篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus
  • C# .NET最小API?
  • 【利器】12个评估大语言模型(LLM)质量的自动化框架
  • GAME JAM:加入我们的甜蜜幽灵冒险之旅
  • Centos安装ffmpeg的方法
  • Electron调用nodejs的cpp .node扩展【非安全】