LeetCode做题记录(第二天)647. 回文子串

news2024/11/26 16:28:22

题目: 647. 回文子串

标签:双指针 字符串 动态规划
题目信息:
在这里插入图片描述
在这里插入图片描述

思路一:暴力实现

我们直接for套for分割成一个个子串再判断,如果子串是回文子串,就+1,最后得出结果

代码实现:

class Solution {
public:
    bool isH(string a){//判断是不是回文串
        int n = a.size();
        if(n==0){
            return false;
        }
        for(int i=0,j=n-1;i<j;i++,j--){
            if(a[i]!=a[j]){
                return false;
            }
        }
        
        return true;
    }

    int countSubstrings(string s) {
        int n = s.size();
        int ans = 0;
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++){
                string ts = s.substr(i,j-i+1);
                // cout<<ts<<",";
                if(isH(ts)){
                    ans++;
                }
            }
        }
        return ans;
    }
};

时间复杂度分析:
遍历的时候是for套for,判断的时候又是套一层for,三重for O(n^3)

思路二:双指针

双指针是一种怎么样的思想呢?
我目前看来,就是在一层for循环中通过两个指针完成两层for循环下才能完成的工作。
这道题也就可以用双指针。在这个题的暴力做法里面,我们不是有分割子串操作吗?我们分割子串这个操作有没有什么方法可以优化一下?
还真有。既然是回文串,当然就要满足两边相等。所以,在回文串中,同时在两端加入一个相同的字符后,新构成的字符串不也还是一个回文串吗?
所以我们可以在遍历字符串的时候,以其中某个字符或者某两个为中心点,向两边扩散构成回文串。

代码实现:

class Solution {
public:
    int extend(string s,int i,int j,int n){//向两边扩散,在扩散的同时判断是否是回文子串并记录
        int res = 0;
        while(i>=0&&j<n&&s[i]==s[j]){
            i--;
            j++;
            res++;
        }
        return res;
    }
    int countSubstrings(string s) {
        int ans = 0;
        //双指针
        int n = s.size();
        for(int i=0;i<n;i++){
            //从中心区开始扩散,
            //以为回文串的长度要么是偶数要么是奇数
            //所以我们要么一个点为中心,要么两个点为中心
            ans+=extend(s,i,i,n);
            ans+=extend(s,i,i+1,n);
        }
        return ans;
    }

};

时间复杂度分析:
O(n^2)

思路三: 动态规划

一个回文串去掉两端一个字符后仍然是一个回文串。
这一道题可以用动态规划来做。
第一步:确定dp数组及其下标含义
dp[i][j] i,j对应的是下标,dp[i][j]则是[i,j]这一段子串是不是回文
第二步:确定递推公式
回文的条件是从左到右,从右到左都是一样的,判断方法则是遍历的时从左右两边同时开始,若都相同则为回文,有不同就不是回文。
当首尾相同时,就会出现三种情况,
1.单独一个字符,即本身。
2.两个字符。
3.两个相同字符之间夹了一个回文串。
if(s[i]==s[j]):
情况1,2:j-i<=1。dp[i][j]=true
情况3:判断中间夹的字符串是不是回文串。dp[i+1][j-1] == true?dp[i][j]=true: continue
第三步:初始化dp数组
第四步:遍历,填充dp数组
遍历的顺序就取决于递推公式。
由上面可以得知,判断dp[i][j]的情况时要知道dp[i+1][j-1],所以先要知道i大的,j小的
于是遍历顺序为:
for(int i=len-1;i>=0;i–){
for(int j=i;j<len;j++){
第五步:检验,得出结果

代码实现:

class Solution {
public:
    int countSubstrings(string s) {
        int len = s.size();
        vector<vector<bool>>dp(len,vector<bool>(len,false));
        int ans = 0;
        for(int i=len-1;i>=0;i--){
            for(int j=i;j<len;j++){
                if(s[i]==s[j]){
                    if(j-i<=1){
                        dp[i][j] = true;
                        ans++;
                    }
                    else if(dp[i+1][j-1]){
                        dp[i][j] = true;
                        ans++;
                    }
                }
            }
        }
        return ans;
    }
};

时间复杂度分析:
O(n^2)

总结:

好难,看不出来动态规划做法。
总结不出来什么东西啊。

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

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

相关文章

C语言实例-约瑟夫生者死者小游戏

问题&#xff1a; 30个人在一条船上&#xff0c;超载&#xff0c;需要15人下船。于是人们排成一队&#xff0c;排队的位置即为他们的编号。报数&#xff0c;从1开始&#xff0c;数到9的人下船&#xff0c;如此循环&#xff0c;直到船上仅剩15人为止&#xff0c;问都有哪些编号…

Missing script:‘dev‘

场景&#xff1a; npm run dev 原因&#xff1a;没有安装依赖&#xff0c;可用镜像安装&#xff08;详见下图ReadMe 蓝色字体&#xff09;&#xff0c;没安装依赖可从package-lock.json文件是否存在看出&#xff0c;存在则有依赖 解决&#xff1a;

KMP算法(算法篇)

算法之KMP算法 KMP算法 概念&#xff1a; KMP算法是用于解决字符串匹配的问题的算法&#xff0c;也就是有一个文本串和一个模式串&#xff0c;求解这个模式串是否在文本串中出现或者匹配。相对于暴力求解&#xff0c;KMP算法使用了前缀表来进行匹配&#xff0c;充分利用了之…

【Vue3】从零开始编写项目

【Vue3】从零开始编写项目 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…

神经网络模型实现(训练、测试)

目录 一、神经网络骨架&#xff1a;二、卷积操作&#xff1a;三、卷积层&#xff1a;四、池化层&#xff1a;五、激活函数&#xff08;以ReLU为例&#xff09;&#xff1a;六、模型搭建&#xff1a;七、损失函数、梯度下降&#xff1a;八、模型保存与加载&#xff1a;九、模型训…

Linux下安装JDK、Tomact、MySQL以及Nginx的超详细步骤

目录 1、为什么安装这些软件 2、安装软件的方式 3、安装JDK 3.1 下载Linux版本的JDK 3.2 将压缩包拖拽到Linux系统下 3.3 解压jdk文件 3.4 修改文件夹名字 3.5 配置环境变量 4、安装Tomcat 4.1 下载Tomcat 4.2 将Tomcat放入Linux系统并解压&#xff0c;步骤如上面的…

MenuToolButton自绘控件,带下拉框的QToolButton,附源码

MenuToolButton自绘控件&#xff0c;带下拉框的QToolButton 效果 下拉样式可自定义 跟随QToolButton的Qt::ToolButtonStyle属性改变图标文字样式 使用示例 正常UI文件创建QToolButton然后提升&#xff0c;或者直接代码创建都可以。 // 创建一个 QList 对象来存储 QPixm…

JDK、JRE、JVM的区别java的基本数据类型

说一说JDK、JRE、JVM的区别在哪&#xff1f; JDK&#xff1a; Java Delopment kit是java工具包&#xff0c;包含了编译器javac&#xff0c;调试器&#xff08;jdb&#xff09;以及其他用于开发和调试java程序的工具。JDK是开发人员在开发java应用程序时候所需要的的基本工具。…

10道JVM经典面试题

1、 JVM中&#xff0c;new出来的对象是在哪个区&#xff1f; 2、 说说类加载有哪些步骤&#xff1f; 3、 JMM是什么&#xff1f; 4、 说说JVM内存结构&#xff1f; 5、 MinorGC和FullGC有什么区别&#xff1f; 6、 什么是STW? 7、 什么情况下会发生堆/栈溢出&#xff1f…

【高中数学/对数函数】log_x_x+1与(x+1)/x,log_x+1_x与x/(x+1)的图线有着惊人的相似性

【图像】 褐线与蓝线&#xff0c;黄线与绿线&#xff0c;只是像左右平移了一样。 【生成图像的代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head>…

大模型学习笔记十二:AI产品部署

文章目录 一、如何选择GPU和云服务器厂商&#xff0c;追求最高性价比1&#xff09;根据场景选择GPU2&#xff09;训练或微调所需显卡&#xff08;以Falcon为例子&#xff09;3&#xff09;服务器价格计算器 二、全球大模型了解1&#xff09;llm所有模型2&#xff09;模型综合排…

基于Python+Django,开发的一个在线教育系统

一、项目简介 使用Python的web框架Django进行开发的一个在线教育系统&#xff01; 二、所需要的环境与组件 Python3.6 Django1.11.7 Pymysql Mysql pure_pagination DjangoUeditor captcha xadmin crispy_forms 三、安装 1. 下载项目后进入项目目录cd Online-educ…

企业微信PC版应用跳转到默认浏览器,避坑指南,欢迎补充(Vue项目版)。。。

引子 关于企业微信PC版应用跳转到默认浏览器&#xff0c;我之前写过一篇文章&#xff1a;企业微信PC版应用跳转到默认浏览器&#xff0c;避坑指南&#xff0c;欢迎补充。。。 以前的文章里用的前后端一体的Jsp项目&#xff0c;这次我使用的是前后端分离的Vue项目&#xff0c;…

数据库——单表查询

一、建立数据库mydb8_worker mysql> use mydb8_worker; 二、建立表 1.创建表 mysql> create table t_worker(department_id int(11) not null comment 部门号,-> worder_id int(11) primary key not null comment 职工号,-> worker_date date not null comment…

Git安装教程 | Git配置教程 | Github

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;本片教程是分享的Git教程的第1️⃣期&#xff1a;Git的安装与配置✈️ 文章目录 1.前言&#x1f347;2.Git下载&#x1f34e;3.Git 的安装&#x1f95d…

Python数据风险案例54——人工智能热门概念股爬虫分析其价值(三因子模型)

案例背景 人工智能概念如火如荼的夏天&#xff0c;在这个2024年&#xff0c;我觉得需要提早布局一下这个概念。所以我们找一下A股里面人们的人工智能概念股&#xff0c;然后分析他们的数据应用三因子模型&#xff0c;也就是最经典的资本资产定价模型的衍生版去研究他们各自的投…

内网穿透原理解析及软件

&#x1f308;所属专栏&#xff1a;【其它】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

OpenGL笔记十四之GLM数学库的配置与使用

OpenGL笔记十四之GLM数学库的配置与使用 —— 2024-07-20 中午 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记十四之GLM数学库的配置与使用1.旋转变换运行效果2.平移变换运行效果3.缩放变换运行效果4.复合变换&#xff1a;先旋转 再平移运行效果5.复合…

Linux网络:应用层协议HTTP(一)

一、什么是HTTP协议 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。 在互联网世界中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&…

8 个实用写歌词技巧,让歌词富有感染力

在音乐的领域中&#xff0c;一首好歌往往离不开充满感染力的歌词。这些歌词能够触动人们的心灵&#xff0c;引发共鸣&#xff0c;让人沉浸其中。接下来&#xff0c;为您分享 8 个实用技巧&#xff0c;帮助您创作出富有感染力的歌词&#xff0c;同时为您介绍“妙笔生词智能写歌词…