刷爆力扣之验证回文串 II

简介: 刷爆力扣之验证回文串 II

一 🏠 题目描述

680. 验证回文串 II


给你一个字符串 s,最多 可以从中删除一个字符


请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false


示例 1:


输入:s ="aba"输出:true

示例 2:


输入:s ="abca"输出:true
解释:你可以删除字符 'c'

示例 3:


输入:s ="abc"输出:false

提示:


1 <= s.length <=105s 由小写英文字母组成


二 🏠破题思路

2.1 🚀 关键信息

解决问题第一步,当然先提取题目字面上的关键信息 😎😎😎


题干简单直白,回文字符串 =**【 一个正读和反读都一样的字符串 】**🌸🌸🌸



提取完题目中的关键信息后,直接进入第二阶段,思路整理 😃😃😃



2.2 🚀 思路整理

贪心算法


定义左右指针,初始时分别指向字符串的第一个字符和最后一个字符,每次判断左右指针指向的字符是否相同,如果不相同,则验证 s[ low + 1, high ] 或 s[ low , high - 1 ] 是否为回文串;如果相同,则将左右指针都往中间移动一位,直到左右指针相遇,则字符串是回文串




LeetCode官网链接 ,有部分删减 🌹🌹🌹



整理完解题思路后,直接进入第三阶段,代码实现 😃😃😃



三 🏠 代码详解

3.1 🚀 代码实现

按照我们刚才的破题思路,直接代码走起来 👇👇👇👇


bool palindrome(const std::string& s, int i, int j) { //验证s[low+1,high]或s[low,high-1]
for ( ; i < j && s[i] == s[j]; ++i, --j); //遍历剩余字符串
    return i >= j; //验证是否为回文串
}
bool validPalindrome(string s) {
    int i =0, j = s.size() -1; //定义左右指针
for ( ; i < j && s[i] == s[j]; ++i, --j); //遍历字符串
    return palindrome(s, i, j -1) || palindrome(s, i +1, j);
}



3.2 🚀 细节解析

看完 👀👀👀 全注释版的代码实现后,相信看官大大对整体逻辑已经是大写的 OK 了 😃😃😃


那么我们挖掘上述实现的晦涩细节 😖😖😖 进行解析,直接开干,走起来 👇👇👇👇


for ( ; i < j && s[i] == s[j]; ++i, --j); //遍历字符串

每次判断左右指针指向的字符是否相同,若相同,则将左右指针都往中间移动一位,直到左右指针相遇,则字符串是回文串 🐌🐌🐌



return palindrome(s, i, j -1) || palindrome(s, i +1, j);

若左右指针指向字符不相同,则验证 s[ low + 1, high ] 或 s[ low , high - 1 ] 是否为回文串 🐳🐳🐳



四 🏠 心路历程

为方便各位看官大大了解博主真实刷题过程,我把当时状态纯纯真实还原,记录在心路历程这一小节,不感兴趣的小伙伴可以直接跳过哈


博主在第一阶段提取 🚀 关键信息没有问题,在第二阶段 🚀 思路整理没有问题


代码实现时构造了临时 Str 对象调用 compare 方法,效率差 😭😭😭 ,代码如下 👇👇👇👇


bool validPalindrome(string s) {
        int len = s.size(), i =0;
for (; 2 * i <= len; ++i) {
if (s[i] != s[len - i -1]) {
                int tmpOffset1 = (len -2 * i +1) / 2;
if (!std::string(s.begin() + i +1, s.begin() + i +1+ tmpOffset1)
                    .compare(std::string(s.rbegin() + i, s.rbegin() + i + tmpOffset1)))     return true;
                int tmpOffset2 = (len -2 * i -1) / 2;
if (!std::string(s.begin() + i, s.begin() + i + tmpOffset2).compare
                    (std::string(s.rbegin() + i +1, s.rbegin() + i +1+ tmpOffset2)))                   return true;
                return false;
            }
        }
        return 2 * i > len ? true : false;
    }


相关文章
|
6月前
|
存储 canal 算法
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
53 0
|
25天前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
10 0
|
3月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
28 6
|
3月前
|
Python
【Leetcode刷题Python】131. 分割回文串
LeetCode题目131的Python编程解决方案,题目要求将给定字符串分割成所有可能的子串,且每个子串都是回文串,并返回所有可能的分割方案。
21 2
|
5月前
|
存储 算法 数据可视化
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
LeetCode 132题详解:使用动态规划与中心扩展法解决分割回文串 II 的最少分割次数问题
|
5月前
|
存储 算法 数据可视化
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
|
5月前
力扣经典150题第二十五题:验证回文串
力扣经典150题第二十五题:验证回文串
34 0
|
5月前
|
canal 算法 数据可视化
LeetCode 125题:验证回文串
LeetCode 125题:验证回文串
|
5月前
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
dp表,哈希表,力扣5.最长回文子串力扣1745.分割回文串IV力扣132.分割回文串II优先级队列(堆)是什么下面是手动实现小根堆力扣1046.最后一块石头的重量
|
5月前
|
存储 算法 Java
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 125. 验证回文串(Java/C/Python3实现含注释说明,Easy)
29 0