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

leetcode: 647. 回文子串

647. 回文子串

来源:力扣(LeetCode)

链接: https://leetcode.cn/problems/palindromic-substrings/

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串

子字符串 是字符串中的由连续字符组成的一个序列

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"

示例 2:

输入:s = "aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"

提示:

  • 1 <= s.length <= 1000
  • s 由小写英文字母组成

解法

有其他的解法,比如中心扩散,马拉车等,可以参考官方题解。

  • 动态规划:前后字符有关联,可以使用暴力搜索或者动态规划,由于暴力搜索复杂度太高,这里只考虑动态规划
    动态规划:四个步骤:
    • 问题定义
    • 状态转移方程
    • 初始条件和边界情况
    • 确定计算顺序(自顶向下,还是自下向上)

问题定义:
字符串是一个连续的字符组合,因此不能只单独的考虑其中一个,另外起点也不都是从0下标开始,可以从前面任何一个位置开始,因此不能直接定义dp[i]来表示前i个字符有多少个回文字符串,而是用二维dp[i][j]表示

定义dp[i][j] 表示字符下标 i 到下标 j 组成的字符串是否为回文串,其中 0≤i≤j,0≤j≤n。

状态转移方程:
如果dp[i][j]是True,则有dp[i+1][j-1]也是回文子串,且s[i]==s[j]
这里需要考虑i,j的距离。如果二者是相邻的,且s[i]==s[j]同样满足条件。

初始化条件和边界条件

  • dp = [[False] * n for _ in range(n)]

确定计算顺序:
这个是从下向上的方向计算即可

代码实现

动态规划

python实现

class Solution:
    def countSubstrings(self, s: str) -> int:
        n = len(s)
        if n == 1:
            return 1
        # dp[i][j] 表示s[i:j]是否是一个回文串
        dp = [[0] * n for _ in range(n)]
        count = 0
        for j in range(n):
            for i in range(j, -1, -1):
                if s[i] == s[j] and (j-i < 2 or dp[i+1][j-1]):
                    dp[i][j] = True
                    count += 1
        return count

c++实现

class Solution {
public:
    int countSubstrings(string s) {
        int n = s.size();
        if (n == 1) return 1;

        vector<vector<bool>> dp(n, vector<bool>(n, false));
        int count = 0;
        for (int j=0; j<n; j++) {
            for(int i=j; i>=0; i--) {
                if (s[i] == s[j] && (j-i<2 || dp[i+1][j-1])) {
                    dp[i][j] = true;
                    count++;
                }
            }
        }
        return count;

    }
};

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

参考

  • https://leetcode.cn/problems/palindromic-substrings/solution/by-lfool-2mvg/
  • https://leetcode.cn/problems/palindromic-substrings/solution/hui-wen-zi-chuan-by-leetcode-solution/

相关文章:

  • SQL语言概述与SQL语言的数据定义
  • NIO知识总结三
  • c语言分层理解(动态内存分配)
  • 【Vite基础】001-使用 Vite 创建 vue3 项目
  • 微服务项目:尚融宝(58)(核心业务流程:提现和还款(1))
  • 限时折扣助力知识店铺销量暴涨
  • 信息学一本通 1213:八皇后问题
  • 网络安全——文件包含漏洞
  • 制造型企业的数字化转型离不开 MES 系统
  • Unity使用新输入系统InputSystem制作飞机大战Demo(对象池设计模式及应用)
  • Oracle-WeiTo基础
  • GTC2021小结
  • RocketMQ——RocketMQ搭建及问题解决
  • 0基础和我学前端---(1)走进前端世界
  • qemu-system-arm搭建arm仿真环境
  • 【mysql】环境安装、服务启动、密码设置
  • django开发-定时任务的使用
  • Invalidate和postInvalidate的区别
  • Linux快速复制或删除大量小文件
  • mockjs让前端开发独立于后端
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Shadow DOM 内部构造及如何构建独立组件
  • SpriteKit 技巧之添加背景图片
  • 半理解系列--Promise的进化史
  • 高性能JavaScript阅读简记(三)
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 警报:线上事故之CountDownLatch的威力
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 算法-图和图算法
  • puppet连载22:define用法
  • 如何在招聘中考核.NET架构师
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # 透过事物看本质的能力怎么培养?
  • #ifdef 的技巧用法
  • (1) caustics\
  • (2015)JS ES6 必知的十个 特性
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (三) diretfbrc详解
  • (五)网络优化与超参数选择--九五小庞
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)VC++中ondraw在什么时候调用的
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • *2 echo、printf、mkdir命令的应用
  • .Mobi域名介绍
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net framework4与其client profile版本的区别
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET多线程执行函数
  • .net快速开发框架源码分享
  • /etc/fstab 只读无法修改的解决办法
  • ::前边啥也没有
  • :中兴通讯为何成功
  • ??javascript里的变量问题
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析