定个小目标之刷LeetCode热题(10)

news2024/11/29 20:37:06

这道题属于一道中等题,看来又得背题了,直接看题解吧,有两种解法

第一种动态规划法

状态:dp[i][j] 表示字符串s在[i,j]区间的子串是否是一个回文串

状态转移方程:当s[i] == s[j] && (j - i < 2 || dp[i + 1][j - 1])时,dp[i][j] = true,否则为false

根据dp[i][j]含义可以画出如下的表格

这个状态转移方程该如何理解呢?主要有以下三点:

1.单个字符肯定是一个回文串,即s[i] == s[j] && j - i == 0

2.当有两个相同的字符时,也是一个回文串,即s[i] == s[j] && j - i == 1

3.当有多个字符时,我们需要把其分成多个区间分别进行判断,那么大区间里肯定包含着小区间,最小区间就是一个字符([0,0]),大区间也是由一个最小区间然后分别往其左右两端加字符进行组合而成的,所以如果要判断一个大区间字符串是否是回文,那么首先就要判断其里面的小区间,举个例子,比如ababa这个字符串记作区间[0,4],里面的bab记作区间[1,3],我们会发现如果区间[1,3]是回文串,那么左右各加一个相等的字符,区间[0,4]必定也是回文串,所以当s[i] == s[j]时,要先看区间[i + 1][j - 1]是不是一个回文串,即dp[i + 1][j - 1]是否为true

动态规划代码如下

class Solution {
    public int countSubstrings(String s) {
        //定义dp这个具有特殊含义的二维数组
        boolean[][] dp = new boolean[s.length()][s.length()];
        //用于记录符合回文的子串个数
        int ans = 0;

        //遍历字符串所有区间,i表示区间的左端,j表示区间的右端
        for (int j = 0; j < s.length(); j++) {
            //i 始终是小于等于 j
            for (int i = 0; i <= j; i++) {
                //利用状态转移方法判断当前区间是否是回文
                if (s.charAt(i) == s.charAt(j) && (j - i < 2 || dp[i + 1][j - 1])) {
                    dp[i][j] = true;
                    ans++;
                }
            }
        }
        return ans;
    }
}

第二种中心扩展法

        思路和动态规划类似,比如对一个字符串 ababa,以最中间的 a 作为中心点,往两边扩散,第一次扩散发现 left 指向的是 b,right 指向的也是 b,所以是回文串,继续扩散,同理 ababa 也是回文串。这个只是以最中间的 a 作为中心点,中心点有很多,然后我们只要寻找到所有的中心点并往两边扩散,扩散结束的条件就是边界和left、right指向的字符是否相等

        字符串长度要么是奇数或者偶数,所以中心点也是奇数或者偶数,又因为奇数表示为2*n + 1,偶数表示为2*n + 2,所以如果是奇就是一个字符,偶就是两个字符,代码如下

class Solution {
    public int countSubstrings(String s) {
        // 获取字符串长度
        int len = s.length();
        // 因为单个字符也是回文,所以把字符串的长度赋值给ans
        int ans = len;
        // 遍历字符串,以单个字符向两边扩散
        for (int i = 0; i < len; i++) {
            // left指向中心点的左边一个字符
            int left = i - 1;
            // right指向中心点的右边的一个字符
            int right = i + 1;
            // 如果两边字符相等则继续扩散,直到越界或者两边的字符不相等
            while (left >= 0 && right < len && s.charAt(left) == s.charAt(right)) {
                // 回文数加一
                ans++;
                // 向左移动
                left--;
                // 向右移动
                right++;
            }
        }
        // 以两个字符向两边扩散,这里i < len - 1,因为只判断了left >= 0,避免让left越界
        for (int i = 0; i < len - 1; i++) {
            // 由于中心点是两个字符组成,则left指向中心点的其中一个,即左则那个
            int left = i;
            // right指向中心点右则那个
            int right = i + 1;
             如果两边字符相等则继续扩散,直到越界或者两边的字符不相等
            while (left >= 0 && right < len && s.charAt(left) == s.charAt(right)) {
                // 回文数加一
                ans++;
                // 向左移动
                left--;
                // 向右移动
                right++;
            }
        }
        return ans;
    }
}

题目链接:题单 - 力扣(LeetCode)全球极客挚爱的技术成长平台

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

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

相关文章

【android】安卓入门学习

文档介绍&#xff1a;http://8.136.122.222/book/primary/kotlin/kotlin-intro.html 文档补充说明&#xff1a;https://blog.csdn.net/qq_42059717/category_12047508.html 一、搭建环境及工具安装 见文档 二、工具界面及项目文件介绍 ├── app //工程主模块名称 │ …

男士应该穿三角裤还是平角裤?三角内裤和平角内裤的区别!

在当今市场&#xff0c;男士内裤的材质种类琳琅满目&#xff0c;但令人遗憾的是&#xff0c;众多男士在选择内裤时却常常忽视舒适度与耐用性&#xff0c;导致穿着体验不佳&#xff0c;甚至出现破损起球的问题。作为一位专业的测评博主&#xff0c;我深感有必要为大家深度剖析男…

nsight systems gui报错

问题&#xff1a;使用命令&#xff1a;nsys-ui打开GUI&#xff0c;点击START以后报错&#xff0c;如图 解决&#xff1a; 命令使用&#xff1a;sudo nsys-ui

Javascript时间循环应用—nextTick()详解

简单易懂 关于nextTick()的理解-CSDN博客 【Vue面试专题】56道经典Vue面试题详解&#xff01;说说nextTick使用和原理&#xff1f;_哔哩哔哩_bilibili Vue.nextTick() 是 Vue.js 提供的一个全局 API&#xff0c;用于在 DOM 更新后执行延迟回调。它通常用于在数据更新后立即获取…

电视剧推荐

1、《春色寄情人》 2、《唐朝诡事录》 3、《南来北往》 4、《与凤行》 5、《利剑玫瑰》 6、《承欢记》

Apple ID已成历史,在ios18中正式更名为Apple Account

随着iOS18的首个开发者预览版成功推送&#xff0c;众多热衷于尝鲜的用户已纷纷升级并开启全新体验。在这个版本中&#xff0c;备受瞩目的Apple ID正式迎来了它的进化——更名为Apple Account&#xff0c;并且拥有了中文名称“Apple账户”或简称“苹果账户”。 不过目前官网还称…

数字员工将重塑工作与生产的未来格局?

数字员工&#xff0c;由AI、机器学习和自动化技术驱动&#xff0c;正逐渐取代或协助人类完成从基础到高端的任务&#xff0c;极大提升工作效率&#xff0c;并改变工作认知。它们不仅影响各行业&#xff0c;还重塑人与机器、社会、自然的关系。与二十世纪末的国企下岗变革相比&a…

Nginx与Gateway

Nginx与Gateway Nginx 基本介绍 Nginx 是一款轻量级的高性能 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。它由俄罗斯的 Igor Sysoev 所开发&#xff0c;最初供俄罗斯大型的门户网站及搜索引擎 Rambler 使用。 Nginx 的特点在于其占用…

GiantPandaCV | 提升分类模型acc(二):图像分类技巧实战

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;提升分类模型acc(二)&#xff1a;图像分类技巧实战 上一篇文章GiantPandaCV | 提升分类模型acc(一)&#xff1a;BatchSize&LARS-CSDN博客探讨了…

开发了一个宝藏云桌面系统,编程小白强烈安利

大家会不会也会有这样的困扰&#xff0c;一个开发小白&#xff0c;在满怀激情的想踏入代码世界时&#xff0c;往往会被一系列复杂的环境配置和软件安装过程绊住了脚步。想象一下&#xff0c;如果你满心期待地想要运行一个简单的“Hello, World!”程序&#xff0c;或是尝试一段刚…

【OpenCV】opencv-4.9.0源码编译

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 公众号&#xff1a;VTK忠粉 前言 本文分享OpenCV-4.9.0源码编译流程&#xff0c;包含CUDA模块&#xff0c;包含Python-opencv&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞…

注册讲堂 | 医疗器械监管的可追溯性与UDI

医疗器械监管的关键-可追溯性 在医疗领域&#xff0c;每一个环节的精准和透明都是至关重要的。医疗器械的可追溯性正是这一需求的核心&#xff0c;它确保了产品从生产到患者使用的整个路径可以被追踪和记录。这不仅关乎患者的安全&#xff0c;也是医疗质量保证的关键。 可追溯…

销售公司客户资源保护,防止飞单私单管理系统

在竞争激烈的销售行业中&#xff0c;飞单问题一直是企业头痛的难题。飞单不仅会导致客户资源流失&#xff0c;还可能损害企业的声誉和利益。传统的销售管理方式已经无法满足现代企业的需求&#xff0c;而销售防飞单管理系统正是解决这一问题的关键。 销售防飞单管理系统通过集…

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效 问题背景 使用undetected_chromedriver包驱动浏览器结束后报错句柄无效 Exception ignored in: <function Chrome.del at 0x000001DD50F07A60> Traceback (most recent call last): File “D:…

MFC绘图

文章目录 消息组成消息的作用获取消息翻译消息常见消息WM_DESTROYWM_SYSCOMMAND 消息循环的阻塞发送消息字符串资源加速键资源GDI绘图对象-画笔位图绘制文本绘制字体模式对话框动态库特点线程创建线程 互斥事件信号量 消息组成 窗口句柄消息ID消息的两个参数消息产生的时间消息…

RPG Maker MZ中被你忽略的干货操作——独立开关和“开关”在事件页中的关系

文章目录 独立开关和“开关”在事件页中的关系图片参考结论确认信息双方同时满足是否执行事件页2如果有2个开关条件和一个“独立开关”条件是否是and关系&#xff1f;如果2个开关满足&#xff0c;但是“独立开关”不满足是否执行&#xff1f; 独立开关和“开关”在事件页中的关…

echarts地图添加外边框(散乱地图块添加区域边界线)

需求&#xff1a; 蓝色边是街道地图&#xff0c;也是实际有用的地图&#xff0c;可以点击拖动之类&#xff0c;由于太散乱&#xff0c;现在增加一个灰色边表示外面区县&#xff08;不可点击&#xff09;&#xff0c;让他看起来是一个整体 下面这个图是我最后做出来的案例 难…

JUC并发编程第十一章——Synchronized与锁升级

1 入门知识介绍 1.1 面试题 谈谈你对Synchronized的理解 请你聊聊Synchronized的锁升级 1.2 本章路线总纲 1.2.1 锁使用的强制要求 【强制】高并发时&#xff0c;同步调用应该去考量锁的性能损耗&#xff0c;能用无锁数据结构&#xff0c;就不要用锁&#xff1b;能锁区块&…

harmony相关开发参考文档

以下列举一些Harmony Os应用开发文档以及相关参考开源案例,可协助高效率开发: 1.鸿蒙NEXT开发官方资料:包含鸿蒙NEXT开发所有的特性,HarmonyOS SDK等,可以按需查阅,需要开通白名单:应用开发导读-入门 | 华为开发者联盟 (huawei.com) 2。OpenHarmony三方库中心仓(一些优…

架构设计 - MySQL 插入数据性能优化策略

mysql 数据库提高数据插入效率主要可以考虑以下方面&#xff1a; 使用批量插入数据的 SQL 语句&#xff0c;避免使用 for 循环逐条记录插入。 所有插入语句共用一个事务&#xff0c;避免1条SQL语句开1个事务&#xff0c;所有操作都完成后再提交事务。 尽量按照索引递增顺序插入…