代码随想录算法训练营day57 | 647. 回文子串,516.最长回文子序列

news2025/1/25 4:44:09

647. 回文子串:

  • 暴力解法:两层for循环,遍历区间起始位置和终止位置,然后判断这个区间是不是回文。时间复杂度:O(n^3).      Output Limit Exceeded

class Solution:
    #时间复杂度:O(n^3)
    def countSubstrings(self, s: str) -> int:
        ans = 0
        for i in range(len(s)):
            for j in range(i+1, len(s)+1):
                print('current substring is', s[i:j])
                if self.isPalindrome(s, i, j-1):
                    print('yes')
                    ans += 1
        return ans


    def isPalindrome(self, str, start, end):
        while start < end:
            if str[start] != str[end]:
                return False
            start += 1
            end -= 1
        return True
  • 动态规划:时间复杂度:O(n^2), 空间复杂度:O(n^2)

五部曲:

1. 确定dp数组以及下标的含义:布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)        的。子串是否是回文子串,如果是dp[i][j]为true,否则为false。

2. 确定递推公式:分析如下四种情况:

  • 当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false;(情况1)
  • 当s[i]与s[j]相等时:
    • 下标i 与 j相同,同一个字符例如a,当然是回文子串;(情况2)
    • 下标i 与 j相差为1,例如aa,也是回文子串;(情况3)
    • 下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。(情况4)

3. dp数组如何初始化:dp[i][j]初始化为false

4. 确定遍历顺序:首先从递推公式中可以看出,情况4是根据dp[i + 1][j - 1]是否为true,再      对dp[i][j]进行赋值true的。如图可以看出,dp[i + 1][j - 1] 在 dp[i][j]的左下角,

如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。

所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的

 

5. 打印检查

class Solution(object):
    def countSubstrings(self, s):
        """
        :type s: str
        :rtype: int
        """
        dp = [[False]*(len(s)+1) for _ in range(len(s)+1)]
        ans = 0
        for i in range(len(s)-1, -1, -1):
            for j in range(i, len(s)):
                if s[i] == s[j]:
                    if j-i <= 1:
                        ans += 1
                        dp[i][j] = True
                    elif dp[i+1][j-1]:
                        ans += 1
                        dp[i][j] = True
        
        return ans
  • 双指针:时间复杂度:O(n^2),空间复杂度:O(1)

  • 首先确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了。
  • 在遍历中心点的时候,要注意中心点有两种情况:
    • ​​​​​​​一个元素可以作为中心点,
    • 两个元素也可以作为中心点。
class Solution:
    def countSubstrings(self, s: str) -> int:
        ans = 0
        for i in range(len(s)):
            ans += self.extendCheck(s, i, i, len(s))
            ans += self.extendCheck(s, i, i+1, len(s))
        return ans

    
    def extendCheck(self, s, i, j, n):
        res = 0
        while i >= 0 and j < n and s[i] == s[j]: #由中心向两边扩散
            i -= 1
            j += 1
            res += 1
        return res

516.最长回文子序列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/40022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程与进程

目录 1.为什么使用线程&#xff1f; 2.什么是线程&#xff1f; 3.进程和线程的工作原理 3.1 进程 3.2 线程 4.线程安全问题 5.总结&#xff1a;线程和进程的区别&#xff08;面试题&#xff09; 1.为什么使用线程&#xff1f; 线程与进程都是用来解决并发编程问题的&…

推荐 5 个不错的 React Native UI 库

最近在做一个 React Native 的项目&#xff0c;调研了下 UI 库&#xff0c;下面列举 5 个&#xff1a; React Native Elements React Native Element 是相当闻名的 UI 库&#xff0c;它遵循 Material 设计规范&#xff0c;同时你还可以精细地控制每一个组件。 TL;DR 22.2k G…

朴素贝叶斯——垃圾邮件过滤

文章目录利用朴素贝叶斯进行文档分类1、获取数据集2、切分文本3、构建词表和分类4、构建分类器5、测试算法利用朴素贝叶斯进行垃圾邮件过滤1、导入数据集2、垃圾邮件预测总结利用朴素贝叶斯进行文档分类 1、获取数据集 下载数据集&#xff0c;获取到一些邮件文档。其中ham文件…

Intersoft WebUI Studio for asp.net/asp.mvc

企业 Web 开发的终极工具集。WebUI 建立在坚实的框架之上&#xff0c;为 ASP.NET 提供创新和先进的 40 多个优质 UI 组件&#xff0c;让您轻松及时地构建强大的业务 Web 应用程序。 不仅仅是全面的 UI 工具集。 在提供业界最佳网络体验的愿景的支持下&#xff0c;WebUI 提供了前…

AQS源码解析 8.共享模式_Semaphore信号量

AQS源码解析—共享模式_Semaphore信号量 简介 synchronized 可以起到锁的作用&#xff0c;但某个时间段内&#xff0c;只能有一个线程允许执行。 Semaphore&#xff08;信号量&#xff09;用来限制能同时访问共享资源的线程上限&#xff0c;非重入锁。 Semaphore 是什么&am…

377. 组合总和 Ⅳ【完全背包】求排列数:外层for背包,内层for物品;求组合数:外层for物品,内层for背包;

377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3], target 4 输出&#x…

如何利用快解析远程访问家庭智能网关

随着家庭宽带用户的暴增&#xff0c;涌现出了许多连接家居设备和控制中心的产品&#xff0c;如家庭智能网关。家庭智能网关是家居智能化的心脏&#xff0c;通过它实现系统的信息采集、信息输入、信息输出、集中控制、远程控制、联动控制等功能。 ​ 智能家庭网关具备智能家居控…

springcloud24:分布式事务 Seata处理分布式事务总结篇

分布式事务&#xff1a; 分布式事务的问题&#xff1a; 1:1 一个servlet 对应一个 数据库1&#xff1a;N 一个servlet对应多个数据库N&#xff1a;N 多个servlet对应多个数据库 全局事务一致性问题&#xff08;全局数据一致性的保证&#xff09; Seata是分布式事务的解决方案 分…

Python标准库之os

1. OS标准库简介 顾名思义&#xff0c;OS表示Operating System&#xff0c;即操作系统。OS标准库是一个操作系统接口模块&#xff0c;提供一些方便使用操作系统相关功能的函数&#xff0c;具体安装位置可通过导入os模块查看os.__file__属性得到。当需要在Python代码中调用OS相…

WPF-页面-DataGrid数据处理-多线程-Winform嵌入

页面 if(NavigationService.CanGoBack true) NavigationService.GoBack(); NavigationService.Navigate(new Uri("Page.xaml",UriKind.Relative));打印对话框PrintDialog如果要一下启动两个窗口&#xff0c;可以重写App.cs中的OnStartUP方法设置窗口所属关系&#…

【我的渲染技术进阶之旅】你知道数字图像处理的标准图上的女孩子是谁吗?背后的故事你了解吗?为啥这张名为Lenna的图会成为数字图像处理的标准图呢?

文章目录一、先来看一张神图&#xff1a;Lenna图二、图片中的妹子是谁&#xff1f;三、为何要使用Lenna图像&#xff1f;四、谁制作了Lenna图像&#xff1f;五、人红是非多六、福利时间七、岁月神偷文末有福利 一、先来看一张神图&#xff1a;Lenna图 想必所有搞过图像处理的人…

LQ0265 汉诺塔【水题】

题目来源&#xff1a;蓝桥杯2012初赛 Java A组C题 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 汉诺塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益智玩具。 大梵天创造世界的时候做了三…

Map和Set常见操作汇总

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 Map 介绍 什么是Map&#xff1f; Map.Entry,> 常用方法 代码 Map中的注意点总结 Set 常见方法汇总 Set中的注意点总结 Map …

Ngxin--源码分析 缓冲区链表

1.基本数据结构 在处理 TCP/HTTP 请求时会经常创建多个缓冲区来存放数据&#xff0c; Nginx缓冲区块简单地组织一个单向链表struct ngx_chain_s {ngx_buf_t *buf;ngx_chain_t *next; };buf: 缓冲区指针 next 下一个链表节点 注意&#xff1a; ngx_chain_t是…

自定义数据类型:结构体、枚举、联合

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 目录结构体结构体类型的声明结构的自引用结构体变量的定义和初始化结构体内存对齐练习1练习2&#xff08;结构体嵌套问题&#x…

JSP表达式(EL)

一、介绍&#xff1a; EL&#xff08;Expression Language&#xff09;可用来代替JSP中的各类脚本&#xff0c;提高编程的灵活度&#xff0c;简化代码的编写。 二、EL的限制&#xff1a; 不能声明变量&#xff0c;需要使用JSTL或者JavaBean Action设置变量。 三、EL的标准格…

使用D435i+Avia跑Fast-LIVO

前言 最近Fast-LIVO开源了&#xff0c;之前看它的论文的时候发现效果很优秀&#xff0c;于是用实验室现有的设备尝试一下。这里主要记录一下使用不带外触发功能的D435i Avia跑Fast-LIVO的过程&#xff0c;为了适配代码&#xff0c;主要修改了雷达的驱动、相机的launch文件、以…

【Flink】各种窗口的使用(处理时间窗口、事件时间窗口、窗口聚合窗口)

文章目录一 Flink 中的 Window1 Window&#xff08;1&#xff09;Window概述&#xff08;2&#xff09; Window类型a 滚动窗口&#xff08;Tumbling Windows&#xff09;b 滑动窗口&#xff08;Sliding Windows&#xff09;c 会话窗口&#xff08;Session Windows&#xff09;2…

ATJ2157内存篇【炬芯音频芯片】---sct语法

ATJ2157 sct语法公共知识篇BNF 简介Sct脚本Sct的作用Sct的语法规则1. 加载域描述(Loadd region descriptions)2. 执行域描述3. 输入节的描述ATJ2157平台使用的sctRO的等效写法ScatterAssert()函数LoadLength()函数LoadBase()函数ImageLimit()函数ATJ2157平台什么数据编译出来是…

CentOS 7.6上安装SqlServer2017

一、 安装 SQL Server 1、 安装 SQL Server 所需的python2 sudo alternatives --config python # If not configured, install python2 and openssl10 using the following commands: sudo yum install python2 sudo yum install compat-openssl10 # Configure python2 a…