首页 > 其他分享 >剑指 Offer II 020. 回文子字符串的个数

剑指 Offer II 020. 回文子字符串的个数

时间:2023-05-02 22:33:05浏览次数:51  
标签:Offer int 复杂度 II ++ 020 ans dp 回文

题目链接:剑指 Offer II 020. 回文子字符串的个数

方法一:动态规划

解题思路

  • 状态表示:\(dp[i][j]\) 表示子字符串 \(s[i,j]\) 是否为回文串;
  • 状态计算:
    • 若 \(s[i]\) != \(s[j]\),显然不是;
    • 若 \(s[i]\) == \(s[j]\),有以下几种可能:
      • \(i\) == \(j\),只有一个字符,是回文串;
      • \(i\) + \(1\) == \(j\),有两个字符且两个字符相同,是回文串;
      • \(i\) + \(1\) < \(j\),此时 \(s[i,j]\) 是否为回文串取决于 \(dp[i + 1][j - 1]\)。
    • 由于当前状态 \(dp[i][j]\) 的计算可能需要 \(dp[i + 1][j - 1]\),因此 \(i\) 从大到小遍历,\(j\) 从小到大遍历。

代码

class Solution {
public:
    int countSubstrings(string s) {
        int n = s.length();
        vector<vector<bool>> dp(n, vector<bool>(n));
        for (int i = 0; i < n; i ++ ) dp[i][i] = true;
        int ans = n; // 一位字符一定为回文串
        for (int i = n - 1; i >= 0; i -- ) {
            for (int j = i + 1; j < n; j ++ ) {
                if (s[i] != s[j]) continue;
                if (j == i + 1 || dp[i + 1][j - 1]) {
                    ans ++ ;
                    dp[i][j] = true;
                }
            }
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n^2)\);
空间复杂度:\(O(n^2)\)。

方法二:中心拓展 + 找规律简化

解题思路

官方解答

代码

class Solution {
public:
    int countSubstrings(string s) {
        int n = s.size(), ans = 0;
        for (int i = 0; i < 2 * n - 1; ++i) {
            int l = i / 2, r = i / 2 + i % 2;
            while (l >= 0 && r < n && s[l] == s[r]) {
                --l;
                ++r;
                ++ans;
            }
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n^2)\);
空间复杂度:\(O(1)\)。

标签:Offer,int,复杂度,II,++,020,ans,dp,回文
From: https://www.cnblogs.com/lxycoding/p/17368446.html

相关文章

  • [ZJOI2020] 序列 线性规划做法/贪心做法
    线性规划做法同时也作为线性规划对偶的一个小小的学习笔记。以下\(\cdot\)表示点积,\(b,c,x,y\)是行向量。\(A\)是矩阵,对于向量\(u,v\)若\(\foralli,u_i\leqv_i\)则称\(u\leqv\),\(\geq\)同理。线性规划标准型:\[\maxc\cdotx\\s.t.\left\{\begin{aligned}&Ax......
  • 【剑指 Offer】 14- II. 剪绳子 II
    【题目】给你一根长度为n的绳子,请把绳子剪成整数长度的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要......
  • 当前标识(IIS APPPOOL\XX)没有对“C:\Windows\Microsoft.NET\Framework64\4.0.30
    当前标识(IISAPPPOOL\WMS.APP)没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\TemporaryASP.NETFiles”的写访问权限。解决此问题为在使用Windows的IIS搭建服务器时,遇到的问题。在网上尝试了各种解决方法后,终于找到了一个可以解决问题的方法,以管理员身份运行命令......
  • 剑指 Offer II 119. 最长连续序列
     分析:题目意思是数组里面能组合起来最长的连续数组然后直接sort排序,如果中间差数不是1就不再连续,count归零当nums[i]和nums[i-1]相等的时候,跳过代码:1classSolution(object):2deflongestConsecutive(self,nums):3"""4:typenums:List[......
  • C/C++《程序设计基础II》[2023-04-30]
    C/C++《程序设计基础II》[2023-04-30]2022级计算机专业《程序设计基础II》小组项目作业作业要求:1.分小组完成,2-4人一组(每个题目后面有人数要求,见附件1);2.任课老师按小组分配任务;3.作业时长为1周;4.提交内容为:WORD文档,内容包括:题目内容、算法分析、代码实现(要求加注释)、运行结......
  • 【剑指 Offer】 60. n个骰子的点数
     【题目】把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。 你需要用一个浮点数数组返回答案,其中第i个元素代表这n个骰子所能掷出的点数集合中第i小的那个的概率。 示例1:输入:1输出:[0.16667,0.16667,0.16667,0.1......
  • 以太网扫盲(一)各种网络总线 mii总线,mdio总线介绍
    本文主要介绍以太网的MAC(MediaAccessControl,即媒体访问控制子层协议)和PHY(物理层)之间的MII(MediaIndependentInterface,媒体独立接口),以及MII的各种衍生版本——GMII、SGMII、RMII、RGMII等。简介从硬件的角度看,以太网接口电路主要由MAC(MediaAccessControl)控制器和物理层接口......
  • 【剑指 Offer】 51. 数组中的逆序对
    【题目】在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 示例1:输入:[7,5,6,4]输出:5 限制:0<=数组长度<=50000来源:力扣(LeetCode)链接:https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-du......
  • day 59 503.下一个更大元素II | 42. 接雨水
    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字x的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出-1。示例1:输入:[1,2,1]输出:[2,......
  • 力扣---1004. 最大连续1的个数 III
    给定一个二进制数组 nums 和一个整数k,如果可以翻转最多k个0,则返回数组中连续1的最大个数。 示例1:输入:nums=[1,1,1,0,0,0,1,1,1,1,0],K=2输出:6解释:[1,1,1,0,0,1,1,1,1,1,1]粗体数字从0翻转到1,最长的子数组长度为6。示例2:输入:nums=[0,0,1,1,0,0,1,1,1,......