【5.9】指针算法-双指针解验证回文字符串 Ⅱ

news/2024/11/9 0:08:05 标签: 算法, 开发语言, c++

一、题目

给定一个非空字符串s, 最多删除一个字符 。判断是否能成为回文字符串。

示例 1:
输入: s = "aba "
输出: true

示例 2:
输入: s = "abca"
输出: true
解释: 你可以删除c字符。

示例 3:
输入: s = "abc"
输出: false

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

二、解题思路

        如果仅仅是验证是否为回文串,这比较简单,之前也讲过利用双指针验证回文串。然而这道题中,如果不是回文串,我们还能够删除一个字符,然后判断其是否为回文。原理依旧与之前相同,使用两个指针 left 和 right,从字符串的两边相向而行。倘若两个指针指向的字符不一样,那就说明不能构成回文串,此时我们可以删除一个字符。可以删除 left 指向的字符,也可以删除 right 指向的字符,如下图所示。

三、代码实现

#include <iostream>
#include <string>

// 判断子串[left, right]是否是回文串
bool isPalindromic(const std::string& s, int left, int right) {
    while (left < right) {
        if (s[left++] != s[right--]) {
            return false;
        }
    }
    return true;
}

// 判断字符串是否是有效的回文串
bool validPalindrome(const std::string& s) {
    // 左指针
    int left = 0;
    // 右指针
    int right = s.length() - 1;
    while (left < right) {
        // 如果两个指针指向的字符不一样,我们要删除一个,要么
        // 删除left指针指向的值,要么删除right指针指向的值
        if (s[left] != s[right]) {
            return isPalindromic(s, left + 1, right) || isPalindromic(s, left, right - 1);
        }
        left++;
        right--;
    }
    return true;
}

int main() {
    std::string s = "abca";
    std::cout << std::boolalpha << validPalindrome(s) << std::endl;  // 输出: true
    return 0;
}
时间复杂度 :O(n),n是字符串的长度
空间复杂度 :O(1),需要额外的常数大小的辅助空间。


http://www.niftyadmin.cn/n/5744608.html

相关文章

速度快还看巡飞,筒射巡飞无人机技术详解

筒射巡飞无人机&#xff08;Launch and Recovery by Tube&#xff0c;LRAT或Launcher-Deployed Loitering Munition&#xff0c;LDLM&#xff09;作为一种新型无人机系统&#xff0c;近年来在军事和民用领域都展现出了巨大的潜力。以下是对筒射巡飞无人机技术的详细解析&#x…

无人机校企联动:飞行、组装、摄影兴趣班技术详解

无人机校企联动在飞行、组装、摄影兴趣班技术培养方面发挥着重要作用。以下是对这些技术领域的详细解析&#xff1a; 一、无人机飞行技术 1. 飞行原理与基础操作 飞行原理&#xff1a;无人机飞行基于空气动力学原理&#xff0c;通过旋翼或固定翼产生升力和前进的动力。学生需…

架构零散知识点

1 数据库 1.1 数据库范式 有一个学生表&#xff0c;主键是学号&#xff0c;含有学生号、学生名、班级、班级名&#xff0c;违反了数据库第几范式&#xff1f; --非主属性不依赖于主键&#xff0c;不满足第二范式 有一个订单表&#xff0c;包含以下字段&#xff1a;订单ID&…

基于毫米波雷达和TinyML的车内检测、定位与分类

英文标题&#xff1a;In-Cabin Detection, Localization and Classification based on mmWave Radar with TinyML 作者信息&#xff1a; 王志飞&#xff0c;程一格&#xff0c;彭辉&#xff0c;周会强&#xff0c;王铮&#xff0c;刘宏全所属机构&#xff1a;Calterah Semico…

最实用的隐私测试工具操作手册来了,错过你就亏了

注&#xff1a;本工具仅适用于未加固的安卓 debug 包 APK 在开始之前&#xff0c;建议大家先回顾一下我们之前发布的关于隐私合规检测的文章。本次分享的隐私测试工具和以往的xpose隐私检测方法&#xff0c;有很大区别&#xff0c;一个对比后支持范围和准确性&#xff0c;另外一…

【数据结构】一文讲解线性表之顺序表概念及其基本操作(附C语言源码)

前文我们讲过数据结构的三个部分&#xff1a;数据、数据元素和数据结构以及数据结构的三要素&#xff1a;逻辑结构、物理结构和数据运算。现在我们从三个组成部分和三要素讲解线性表的定义和基本操作 定义 线性表是一个抽象的概念&#xff0c;一般具有相同数据类型的n(n>0…

开源模型应用落地-glm模型小试-glm-4-9b-chat-快速体验(一)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型&#xff0c;旨在自动理解和规划用户的复杂指令&#xff0c;并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等&#xff0c;支持128K的上下文窗口&#xff0c;使其在长文本处理和精度召回方面表现优异&a…

Redis - Set 集合

一、基本了解 集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中1&#xff09;元素之间是⽆序 的2&#xff09;元素不允许重复&#xff0c;如图2-24所⽰。⼀个集合中最多可以存储 32 2 − 1 个元素。Redis除了⽀持 集合内的增删查改…