leetcode647 回文子串

news/2024/11/17 3:53:08/
题目

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

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

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

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

示例

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

解析

这道题还是用动归五部曲来分析下:
1.确定dp数组及其含义
对于大多数求子序列类的题目来说,求什么我们就定义什么,比如求回文子串的数目我们就定义成这个,但是对于这道题来说,dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系;
因此这道题,要定义dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
2.确定递推公式
还是先分为两步,如果s[i] != s[j],那什么都不用说了,肯定是dp[i][j] = false;
如果相等,还需要再细分为以下三种情况:
一、下标 i == j,那么指向的是一个值,肯定是回文串
二、下标i - j = 1,因为此时的前提已经是s[i] == s[j]了,所以是类似与aa的,也是回文串
三、下标差大于1,那么就看dp[i+1][j-1]是不是回文串
3.初始化
初始化当然是false
4.遍历顺序,求dp[i][j]的时候,子串是dp[i+1][j-1],相当于二维数组中的左下角位置,因此二维数组的遍历是从下到上,从左到右

func countSubstrings(s string) int {dp := make([][]bool, len(s) + 1)for i := range dp {dp[i] = make([]bool, len(s) + 1)}res := 0for i := len(s)-1; i >= 0; i-- {for j := i; j <= len(s)-1; j++ {if s[i] == s[j] {if j - i <= 1 {dp[i][j] = trueres++} else if dp[i+1][j-1] {dp[i][j] = trueres++}}} }return res
}

注意里面遍历顺序那里,为什么内层循环需要j :=i呢,因为dp数组定义的是[i,j],所以j一定是大于i的;


上面的那种方法其实有点麻烦,还可以使用中心扩展法:
遍历s,以每个字母为中心扩散,判断是否为回文串
扩散时分两种情况:一个点为中心 或 两个点为中心

func countSubstrings(s string) int {n := len(s)result := 0for i := 0; i <= n-1; i++ {result += extend(s, i, i, n) // 一个点为中心result += extend(s, i, i+1, n) // 两个点为中心}return result
}
func extend(s string, i,j,n int) int{res := 0for i >= 0 && j < n && s[i] == s[j] {i-- //因为要中心扩展,所以符合条件的要在此基础上,分别向左右扩展j++res++}return res
}

http://www.ppmy.cn/news/19620.html

相关文章

机器视觉_HALCON_HDevelop用户指南_1.HDevelop介绍

文章目录前言一、HDevelop介绍1. 关于HDevelop的几点事实2. HDevelop XL3. 术语&使用前言 看完了HALCON快速向导之后&#xff0c;对HALCON有个大致认识&#xff08;HALCON基本概念、使用的场景&#xff09;。但距离实战还差得远&#xff0c;接下来我觉得可以开始学习使用H…

【大数据管理】Java实现字典树TireTree

实现字典树&#xff0c;支持插入和删除&#xff0c;能够打印每一层的数据示例数据“SJ”, “SHJ”, “SGYY”,"HGL" ,将这些数据插入前缀树&#xff0c;打印树&#xff0c;修改SHZ为SHHZ 解题思路 Trie树即字典树&#xff0c;又称单词查找树或键树&#xff0c;是一…

SpringBoot 统一功能处理

SpringBoot 统一功能处理前言一、用户登录权限效验1.1 最初的用户登录验证1.2 Spring AOP 用户统一登录验证的问题1.3 Spring 拦截器1.3.1 准备工作1.3.2 自定义拦截器1.3.3 将自定义拦截器加入到系统配置1.4 拦截器实现原理1.4.1 实现原理源码分析1.4.2 拦截器小结1.5 扩展&am…

基于Python语言和PyQt5的铁路列车运行图系统

概述 本项目是基于Python语言和PyQt5的非官方性质、简易的中国铁路列车运行图系统。本代码的发布遵循GPLv3协议。在协议允许范围内,作者保留一切权利和最终解释权。 与ETRC的联系 渊源 pyETRC项目的最初灵感来源和很多功能设置都来自由LGuo等前辈基于java语言开发的ETRC列车运…

Day08 C++STL入门基础知识五——vector容器(下) 插入删除-数据存取-交换容器-预留空间【全面深度剖析+例题代码展示】

More haste, less speed. 欲速则不达 文章目录1. 承接上文2. 插入操作2.1 函数原型(总括)2.2 尾插尾删2.2.1 操作2.2.2 代码展示2.2.3 测试结果2.3 迭代器插入2.3.1 操作2.3.2 代码展示2.3.3 测试结果2.4 think小思考2.4.1 小疑问2.4.2 思路2.4.3 代码展示2.4.4 测试结果3. 删除…

LeetCode(Array) 1512. Number of Good Pairs

1.问题 Given an array of integers nums, return the number of good pairs. A pair (i, j) is called good if nums[i] nums[j] and i < j. Example 1: Input: nums [1,2,3,1,1,3] Output: 4 Explanation: There are 4 good pairs (0,3), (0,4), (3,4), (2,5) 0-inde…

冯诺依曼体系结构及操作系统(OS)的简单认识

文章目录冯诺依曼体系结构操作系统&#xff08;Operator System&#xff09;冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储结构。数学家冯诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑…

06 | 要找工作了,应该如何准备?

前言 前言&#xff1a;找工作更像相亲&#xff0c;总有一款适合自己。简历就像一份广告&#xff0c;对方要什么你写什么&#xff0c;而不是你有什么。 文章目录前言一、找工作的流程二、做法1. 分析职位描述&#xff08;JD&#xff09;1&#xff09;组成2&#xff09;做法一、找…