【动态规划】回文串类型问题 回文子串

题目链接:https://leetcode.cn/problems/a7VOhD/


一.先介绍一下回文串问题

        回文串通俗来讲就是正着读反着读得到的结果一样,其中0位置与n-1位置相同、1位置与n-2位置相同以此类推,这条经验也是回文串问题的重要判断条件。接下来我介绍几种特殊的回文串。


二.题目介绍

        题目所求是字符串s中有多少子串是回文串,这里子串的概念和子数组一致,是在题目给出的字符串中找出一段有顺序的连续的子字符串。


三.状态分析

        这里注意两个细节:1.填表顺序,我在"最长等差数列"一题总结过,填表顺序是由状态方程决定的,本题的状态方程为:dp[ i ][ j ] = dp[ i+1][ j-1]i 位置决定填表顺序是由下到上,j 位置决定填表顺序是由左到右的,2.遍历顺序遍历顺序通常是我们设定状态时同时确定的隐藏条件,比如本题的回文串,i 表示首元素的位置,j 表示尾元素的位置,始终 i <= j 的,所以 j的遍历顺序是从 i-1到 n-1位置。


四.完整代码

 int countSubstrings(string s) 
    {
        int n = s.size(), res = 0;
        vector<vector<bool>> dp(n, vector<bool>(n));
        for(int i = n-1; i >= 0; i--)
        {
            for(int j = i; j < n; j++) 
            //这里下标有一个默认规律:i<=j,所以这就确定了j的遍历是在i之后遍历
            {
                if(s[i] == s[j])
                {
                    if(i+1 < j)
                        dp[i][j] = dp[i+1][j-1];
                    else
                        dp[i][j] = true;
                        
                    if(dp[i][j])
                        res += 1;
                }
            }
        }

        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++初级主要包括基本语法、数据类型、控制流程、函数、数组、指针等内容。下面是一个简单的介绍: 1. 基本语法:C++是一种面向对象的编程语言,使用分号作为语句结束符,使用花括号表示代码块。 2. 数据类型:C++提供了多种数据类型,包括整型、浮点型、字符型、布尔型等。可以使用关键字来声明变量,并进行初始化。 3. 控制流程:C++提供了条件语句(if-else语句、switch语句)和循环语句(for循环、while循环、do-while循环)来控制程序的执行流程。 4. 函数:C++中可以定义函数来封装一段可重用的代码。函数可以有参数和返回值,可以在函数内部进行各种操作。 5. 数组:C++中可以使用数组来存储一组相同类型的数据。数组可以通过索引访问元素,并可以进行遍历和操作。 6. 指针:C++中的指针是一种特殊的变量,它存储了内存地址。可以使用指针来访问和修改内存中的数据。 关于求字符串中连续回文子串的最大长度,可以使用动态规划算法来解决。具体步骤如下: 1. 定义一个二维数组dp,其中dp[i][j]表示字符串从索引i到j的子串是否为回文子串。 2. 初始化dp数组,将所有长度为1的子串都标记为回文子串。 3. 遍历字符串,从长度为2的子串开始,依次判断每个子串是否为回文子串。如果是回文子串,则更新dp数组。 4. 在遍历过程中记录最长的回文子串长度。 5. 返回最长的回文子串长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值