验证回文串 II - 题解与分析

680. 验证回文串 II - 题解与分析

题目描述

给定一个字符串 s,最多可以从中删除一个字符。请判断 s 是否能通过删除一个字符后变成回文字符串。如果能,则返回 true;否则,返回 false

示例 1:

输入:s = "aba"

输出:true

示例 2:

输入:s = "abca"

输出:true

解释:你可以删除字符 'c'

示例 3:

输入:s = "abc"

输出:false

提示:

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

解题思路

回文字符串的定义

回文字符串是一个正读和反读都相同的字符串。比如 "aba""madam" 都是回文字符串。

本题关键点

  1. 最多删除一个字符:我们只允许最多删除一个字符,若删除一个字符后的字符串能变成回文字符串,返回 True,否则返回 False
  2. 双指针法:我们可以使用双指针从字符串的两端向中间靠拢。如果两指针指向的字符相等,继续向中间推进;如果字符不相等,我们有两种选择:
    • 删除左侧的字符,判断删除后剩下的子串是否是回文。
    • 删除右侧的字符,判断删除后剩下的子串是否是回文。

如果其中任何一种情况能形成回文字符串,返回 True,否则返回 False

解决方案

我们可以通过以下步骤来实现解法:

  1. 使用双指针 leftright 从字符串两端开始扫描。
  2. 如果 s[left] == s[right],则继续向中间推进。
  3. 如果 s[left] != s[right],我们有两种选择:
    • 删除 s[left],检查子串 s[left+1:right+1] 是否是回文。
    • 删除 s[right],检查子串 s[left:right] 是否是回文。
  4. 如果这两种选择中有一种能够形成回文字符串,则返回 True。否则返回 False

辅助函数:判断回文

我们定义一个辅助函数 is_palindrome 来判断给定子串是否是回文。

def is_palindrome(s: str, left: int, right: int) -> bool:while left < right:if s[left] != s[right]:return Falseleft += 1right -= 1return True

代码实现

class Solution:def validPalindrome(self, s: str) -> bool:# 双指针left, right = 0, len(s) - 1while left < right:if s[left] != s[right]:# 如果字符不匹配,尝试删除一个字符# 递归检查删除左侧字符后的子串或删除右侧字符后的子串是否是回文return is_palindrome(s, left + 1, right) or is_palindrome(s, left, right - 1)left += 1right -= 1return Truedef is_palindrome(s: str, left: int, right: int) -> bool:while left < right:if s[left] != s[right]:return Falseleft += 1right -= 1return True

时间复杂度

  1. 主函数 validPalindrome:我们使用双指针从两端向中间遍历字符串。最坏情况下,我们会遍历整个字符串一次,时间复杂度为 O(n),其中 n 是字符串的长度。
  2. 辅助函数 is_palindrome:每次递归调用时,我们最多需要遍历剩余的子串,时间复杂度为 O(n)

因此,整体的时间复杂度为 O(n),其中 n 是字符串的长度。

空间复杂度

  • 我们没有使用额外的空间,除了 leftright 两个指针,空间复杂度是 O(1)

代码示例

class Solution:def validPalindrome(self, s: str) -> bool:left, right = 0, len(s) - 1while left < right:if s[left] != s[right]:return is_palindrome(s, left + 1, right) or is_palindrome(s, left, right - 1)left += 1right -= 1return Truedef is_palindrome(s: str, left: int, right: int) -> bool:while left < right:if s[left] != s[right]:return Falseleft += 1right -= 1return True

总结

本题利用双指针从两端向中间扫描的方法,结合辅助函数判断子串是否是回文,解决了最多删除一个字符是否能使字符串成为回文的问题。通过优化判断回文的方式,时间复杂度保持在 O(n),效率较高,适合处理较长的字符串。

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

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

相关文章

Adaptive LLM Transformer²

看到了一个不错的论文https://arxiv.org/pdf/2501.06252 TRANSFORMER-SQUARED: SELF-ADAPTIVE LLMS 挺有意思的&#xff0c;是一家日本AI公司SakanaAI的论文&#xff08;我以前写过他们的不训练提升模型的能力的文章&#xff0c;感兴趣可以去翻&#xff09;它家有Lion Jones坐镇…

优化代码性能:利用CPU缓存原理

在计算机的世界里&#xff0c;有一场如同龟兔赛跑般的速度较量&#xff0c;主角便是 CPU 和内存 。龟兔赛跑的故事大家都耳熟能详&#xff0c;兔子速度飞快&#xff0c;乌龟则慢吞吞的。在计算机中&#xff0c;CPU 就如同那敏捷的兔子&#xff0c;拥有超高的运算速度&#xff0…

linux 函数 sem_init () 信号量、sem_destroy()

&#xff08;1&#xff09; &#xff08;2&#xff09; 代码举例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h>sem_t semaphore;void* thread_function(void* arg) …

分库分表技术方案选型

一、MyCat 官方网站&#xff0c;技术文档 MyCat是一款由阿里Cobar演变而来的用于支持数据库读写分离、分片的数据库中间件。它基于MySQL协议&#xff0c;实现了MySQL的协议和能力&#xff0c;并作为代理层位于应用和数据库之间&#xff0c;可以隐藏底层数据库的复杂性。 原理…

【智力测试——二分、前缀和、乘法逆元、组合计数】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int mod 1e9 7; const int N 1e5 10; int r[N], c[N], f[2 * N]; int nr[N], nc[N], nn, nm; int cntr[N], cntc[N]; int n, m, t;void init(int n) {f[0] f[1] 1;for (int i …

IBM DB2常用命令(windows版),包含建库、建表、增删改查等命令

安装IBM DB2可以参考我上篇博客&#xff1a;IBM Db2 & IBM Db2 Data Management Console(可视化管理工具)的下载与安装&#xff08;简洁版&#xff09;-CSDN博客 使用管理员权限打开cmd窗口 G: cd G:\IBM\SQLLIB\BIN db2cmd首先&#xff0c;在服务端需要配置好服务名、监…

Flutter Scaffold 页面结构

Material是一套设计风格&#xff0c;提供了大量的小部件&#xff0c;这里用Material风格搭建一个常见的应用页面结构。 创建Material应用 import package:flutter/material.dart;class App extends StatelessWidget {overrideWidget build(BuildContext context) {return Mat…

【C++】string类(上):string类的常用接口介绍

文章目录 前言一、C中设计string类的意义二、string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作2.1 size、capacity 和 empty的使用2.2 clear的使用2.3 reserve的使用2.4 resize的使用 3. string类对象的访问及遍历操作3.1 下标[ ] 和 at3.2 迭代器it…

一文讲解Java中的ArrayList和LinkedList

ArrayList和LinkedList有什么区别&#xff1f; ArrayList 是基于数组实现的&#xff0c;LinkedList 是基于链表实现的。 二者用途有什么不同&#xff1f; 多数情况下&#xff0c;ArrayList更利于查找&#xff0c;LinkedList更利于增删 由于 ArrayList 是基于数组实现的&#…

STM32 DMA+AD多通道

接线图 代码配置 ADC单次扫描DMA单次转运模式 uint16_t AD_Value[4]; //DMAAD多通道 void DMA_Config(void) {//定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量 ADC_InitTypeDef ADC_InitStructure; //定义ADC结构体变量 DMA_InitTypeDef DMA_In…

浅谈《图解HTTP》

感悟 滑至尾页的那一刻&#xff0c;内心突兀的涌来一阵畅快的感觉。如果说从前对互联网只是懵懵懂懂&#xff0c;但此刻却觉得她是如此清晰而可爱的呈现在哪里。 介绍中说&#xff0c;《图解HTTP》适合作为第一本网络协议书。确实&#xff0c;它就像一座桥梁&#xff0c;连接…

Alibaba开发规范_异常日志之日志规约:最佳实践与常见陷阱

文章目录 引言1. 使用SLF4J日志门面规则解释代码示例正例反例 2. 日志文件的保存时间规则解释 3. 日志文件的命名规范规则解释代码示例正例反例 4. 使用占位符进行日志拼接规则解释代码示例正例反例 5. 日志级别的开关判断规则解释代码示例正例反例 6. 避免重复打印日志规则解释…

自动化软件测试的基本流程

一、自动化测试的准备 1.1 了解测试系统 首先对于需要测试的系统我们需要按照软件需求说明书明确软件功能。这里以智慧养老系统作为案例进行测试&#xff0c;先让我们看看该系统的登录界面和用户管理界面。 登录界面&#xff1a; 登录成功默认界面&#xff1a; 用户管理界面…

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …

计算机网络中常见高危端口有哪些?如何封禁高危端口?

保障网络安全&#xff0c;从封禁高危端口开始&#xff01; 在计算机网络中&#xff0c;端口是设备与外界通信的“大门”&#xff0c;但某些端口因常被黑客利用而成为高危入口。封禁这些端口是防御网络攻击的关键一步。本文将详解 10个常见高危端口&#xff0c;并提供多平台封禁…

CommonJS

CommonJS 是由 JavaScript 社区于 2oo9 年提出的包含模块、文件、IO、控制台在内的一系列标准。Node.js 的实现中采用了 CommonJS 标准的一部分&#xff0c;并在其基础上进行了一些调整。我们所说的 CommonJS 模块和 Node.js 中的实现并不完全一样&#xff0c;现在一般谈到 Com…

[SAP ABAP] ABAP SQL跟踪工具

事务码ST05 操作步骤 步骤1&#xff1a;使用事务码ST05之前&#xff0c;将要检测的程序生成的页面先呈现出来&#xff0c;这里我们想看下面程序的取数操作&#xff0c;所以停留在选择界面 步骤2&#xff1a; 新建一个GUI窗口&#xff0c;输入事务码ST05&#xff0c;点击 Acti…

蓝桥杯备考:高精度算法之除法

我们除法的高精度其实也不完全是高精度&#xff0c;而是一个高精度作被除数除以一个低精度 模拟我们的小学除法 由于题目中我们的除数最大是1e9&#xff0c;当它真正是1e9的时候&#xff0c;t是有可能超过1e9的&#xff0c;所以要用long long

算法竞赛(Python)-堆栈

文章目录 一 基础知识二 题目有效的括号字符串解码 一 基础知识 堆栈&#xff08;Stack&#xff09;&#xff1a;简称为栈。一种线性表数据结构&#xff0c;是一种只允许在表的一端进行插入和删除操作的线性表。   我们把栈中允许插入和删除的一端称为 「栈顶&#xff08;top…

SpringBoot 中的测试jar包knife4j(实现效果非常简单)

1、效果图 非常快的可以看见你实现的接口 路径http://localhost:8080/doc.html#/home 端口必须是自己的 2、实现效果 2.1、导入jar包 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-star…