作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/valid-palindrome-ii/description/

题目描述

Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome.

Example 1:

Input: "aba"
Output: True

Example 2:

Input: "abca"
Output: True
Explanation: You could delete the character 'c'.

Note:

  • The string will only contain lowercase characters a-z. The maximum length of the string is 50000.

题目大意

最多删除一个字符后,判断剩余的字符串是否为回文串。

解题方法

双指针

思路来源

题目问我们最多删除一个字符的情况下是否可以构成回文字符串,第一反应是逐个删除各个字符看剩下的字符串是否为回文串,但是这个时间复杂度是 O(N ^ 2),题目给出的字符串的长度最大为 50000 ,此做法会超时。

回文串的特点是左右对称。假如有两个指针从字符串的两端同时向中间走:如果遇到的元素相等,则该相等的元素是最终回文字符串的一部分;如果遇到的元素不等,则认为此时遇到了构建回文字符串的「障碍」,应当进行处理,处理方式见下文。

初版方案

当遇到不等的元素时,按照题目的意思,我们处理的方式是删除一个字符,判断 删除一个字符后的剩余所有字符 是否可以构成回文串。

我们观察一下题目给出的示例 2:

输入: "abca"
输出: True
解释: 你可以删除c字符。

如果左右指针从两端同时向中间走,那么:

第一步:
a b c a
| |
left right 第二步:
a b c a
| |
left right

第一步,左右指针遇到的元素相等,继续向中间走;
第二步,左右指针遇到的元素不等,则必须进行处理:我们必须删除其中的一个字符,然后再判断 剩余的所有字符 是否是回文串。

删除 b:
a c a
或者, 删除 c:
a b a

即判断 aca 或者 aba 是否为回文字符串。

如果删除一个字符后,剩余的全部字符构成字符串 是回文字符串,那么就满足题意。

本方案的时间复杂度是:O(N);由于我判断是否回文使用了 [::-1] 翻转形成了新字符串,所以空间复杂度是O(N)。如果不通过翻转的方式来判断,空间复杂度可以降到O(1)

Python 代码如下。

class Solution(object):
def validPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
isPalindrome = lambda s: s == s[::-1]
strPart = lambda s, x: s[:x] + s[x + 1:]
left = 0
right = len(s) - 1
while left < right:
if s[left] != s[right]:
return isPalindrome(strPart(s, left)) or isPalindrome(strPart(s, right))
left += 1
right -= 1
return True

进阶方案

我们注意到「初版方案」中,在找到第一个不相等的元素后,删除了不相等的一个元素,判断剩下的所有字符串是不是回文字符串。这个做法和题目的意思完全一致。是否可以简化呢?

分析发现,在找到不相等的元素时,leftright 指针外边的元素已经判断过是回文的,因此不用再次判断。只用判断 [left, right] 区间中,删除 left 或者 right 指向的元素,剩余的区间 (left, right] 或者 [left, right) 是否为回文串。

(left, right] 或者 [left, right) 为回文串,则说明删除了一个字符可以构成回文串。

举上面的例子来说,当左右指针遇到了不等元素时,删除 left 或者 right 指向元素, 我们只用判断 c 或者 b 是否为回文串,因为这两者是回文串,所以总体的字符串 s 删除 left 或者 right 指向元素也可以构成回文串。

本方案的时间复杂度是:O(N);由于我判断是否回文使用了 [::-1] 翻转形成了新字符串,所以空间复杂度是O(N)。如果不通过翻转的方式来判断,空间复杂度可以降到O(1)

虽然时间复杂度和初版方案一样是O(N),但这个方案所要检查的回文更少。

Python 代码如下。

class Solution(object):
def validPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
isPalindrome = lambda x : x == x[::-1]
left, right = 0, len(s) - 1
while left <= right:
if s[left] == s[right]:
left += 1
right -= 1
else:
return isPalindrome(s[left + 1 : right + 1]) or isPalindrome(s[left: right])
return True

日期

2018 年 2 月 4 日
2018 年 11 月 24 日 —— 周日开始!一周就过去了~
2020 年 5 月 19 日 —— 希望工作效率更高

【LeetCode】680. Valid Palindrome II 验证回文字符串 Ⅱ(Python)的更多相关文章

  1. [LeetCode] 680. Valid Palindrome II 验证回文字符串 II

    Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...

  2. LeetCode 680. Valid Palindrome II (验证回文字符串 Ⅱ)

    Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...

  3. Leetcode680.Valid Palindrome II验证回文字符串2

    给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca" 输出: ...

  4. [LeetCode] Valid Palindrome II 验证回文字符串之二

    Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...

  5. [leetcode]680. Valid Palindrome II有效回文II(可至多删一原字符)

    Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...

  6. LeetCode OJ:Valid Palindrome(验证回文)

    Valid Palindrome Given a string, determine if it is a palindrome, considering only alphanumeric char ...

  7. 【LeetCode】- Valid Palindrome(右回文)

    [ 问题: ] Given a string, determine if it is a palindrome, considering only alphanumeric characters an ...

  8. LeetCode 125 Valid Palindrome(有效回文)(*)

    翻译 给定一个字符串.确定它是否是回文的,仅仅考虑当中的数字和字符并忽略其它. 比如. "A man, a plan, a canal: Panama" 是回文的. "r ...

  9. LeetCode 680. Valid Palindrome II(双指针)

    题意:给定一个字符串,可以最多去掉一个字符,判断是否可以使该字符串成为一个回文串. 分析:head和tail双指针分别指向字符串首尾,如果s[head] != s[tail],则要么去掉s[head] ...

随机推荐

  1. lua table与json的之间的互相转换高性能c++实现

    请自行约束两种语言数据结构语法上的不同,避开如下问题: 1.json本身不约束key是否符合一个编程语言中的变量名,所以编写用于和编程语言数据结构交互的json代码时应该注意key是否正确. 2.lu ...

  2. LightningChart JS v.3.3.0全新版本现已发布!

    LightningChart JS v.3.3.0已经发布啦!!! 欢迎了解更多关于最新的性能改进.新的用户界面功能和新的图表类型的信息! WebGL兼容性和新的UI功能 WebGL是Lightnin ...

  3. java四则运算规则

    java四则运算规则 1.基本规则 运算符:进行特定操作的符号.例如:+ 表达式:用运算符连起来的式子叫做表达式.例如:20 + 5.又例如:a + b 四则运算: 加:+ 减:- 乘:* 除:/ 取 ...

  4. 日常Java 2021/11/16

    获得applet参数 下面的例子演示了如何使用一个Applet响应来设置文件中指定的参数.该Applet显示了-个黑色棋盘图案和第二种颜色.第二种颜色和每一列的大小通过文档中的Applet的参数指定. ...

  5. day32 HTML

    day32 HTML 什么是前端 只要是跟用户打交道的界面都可以称之为前端 # eg:电脑界面, 手机界面,平板界面, 什么是后端? eg:python, java,php,go, 不跟用户直接打交道 ...

  6. 如果通过 IP 判断是否是爬虫

    通过 IP 判断爬虫 如果你查看服务器日志,看到密密麻麻的 IP 地址,你一眼可以看出来那些 IP 是爬虫,那些 IP 是正常的爬虫,就像这样: 在这密密麻麻的日志里面,我们不仅要分辨出真正的爬虫 I ...

  7. Shell学习(九)——chattr与lsattr命令详解

    有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了.chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的linux ...

  8. display:inline-block,block,inline元素的区别

    1.display:block将元素显示为块级元素,从而可以更好地操控元素的宽高,以及内外边距,每一个块级元素都是从新的一行开始.2.display : inline将元素显示为行内元素,高度,行高以 ...

  9. Undefined symbols for architecture arm64:问题

    Undefined symbols for architecture arm64: "_sqlite3_prepare_v2", referenced from: +[HMJSch ...

  10. rust方法集

    随机数.数字对比.控制台输入 use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("please ...