680. 验证回文字符串 Ⅱ (Python 实现)

该博客讨论了一个编程问题,即如何确定一个字符串在删除最多一个字符后是否能成为回文。它提供了示例输入和输出,并给出了Python代码实现,代码中通过双指针方法检查字符串是否可以变为回文,通过删除左右两端的一个字符来实现。

题目:

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

示例 1:

输入: s = “aba”
输出: true

示例 2:

输入: s = “abca”
输出: true
解释: 你可以删除c字符。

示例 3:

输入: s = “abc”
输出: false

因为最多只能删除一个字符,那么在从两端往中间进行判断的时候遇见左右两指针指向的字符不相等的时候:我们对当前两指针指向的字符和中间剩余的字符进行是否是回文字符的判断即可(只删除左指针之后和只删除右指针之后,二者有一个复合回文字符即可)
代码:

class Solution:
    def validPalindrome(self, s: str) -> bool:
        l, r = 0, len(s)-1
        while l <= r :
            if s[l] == s[r]:
                l += 1
                r -= 1
            else:
                j_1 = s[l+1:r+1]#删掉左边不等的进行判断,r+1是因为当前r代表的指针也是为判断的字符需要包含在内
                j_2 = s[l:r]#删掉右边不等的进行判断
                return j_1 == j_1[::-1] or j_2 == j_2[::-1]
        return 1 == 1
# 力扣hot100刷题记录表 ### 一,哈希部分 - [ ] 1. 两数之和 (简单) - [ ] 2. 字母异位词分组(中等) - [ ] 3. 最长连续序列(中等) ### 二,双指针部分 - [ ] 4. 移动零(简单) - [ ] 5. 盛水最多的容器 (中等) - [ ] 6. 三数之和 (中等) - [ ] 7. 接雨水(困难) ### 三,滑动窗口 - [ ] 8. 无重复字符的最长子串(中等) - [ ] 9. 找到字符中所有的字母异位词(中等) ### 四,子串 - [ ] 10. 和为k的子数组(中等) - [ ] 11. 滑动窗口最大值(困难) - [ ] 12. 最小覆盖子窜(困难) ### 五,普通数组 - [ ] 13. 最大子数组和(中等) - [ ] 14. 合并区间(中等) - [ ] 15. 轮转数组(中等) - [ ] 16. 除自身以外数组的乘积(中等) - [ ] 17. 缺失的第一个正数(困难) ### 六,矩阵 - [ ] 18. 矩阵置零(中等) - [ ] 19. 螺旋矩阵 (中等) - [ ] 20. 旋转图像 (中等) - [ ] 21. 搜索二维矩阵Ⅱ (中等) ### 七,链表 - [ ] 22. 相交链表 (简单) - [ ] 23. 反转链表 (简单) - [ ] 24. 回文链表 (简单) - [ ] 25. 环形链表 (简单) - [ ] 26. 环形链表Ⅱ (中等) - [ ] 27. 合并两个有序链表 (简单) - [ ] 28. 两数相加 (中等) - [ ] 29. 删除链表的倒数第 N 个结点 (中等) - [ ] 30. 两两交换链表中的节点 (中等) - [ ] 31. K个一组翻转链表 (困难) - [ ] 32. 随机链表的复制 (中等) - [ ] 33. 排序链表 (中等) - [ ] 34. 合并 K 个升序链表 (困难) - [ ] 35. LRU 缓存 (中等) ### 八,二叉树 - [ ] 36. 二叉树的中序遍历 (简单) - [ ] 37. 二叉树的最大深度 (简单) - [ ] 38. 翻转二叉树 (简单) - [ ] 39. 对称二叉树 (简单) - [ ] 40. 二叉树的直径 (简单) - [ ] 41. 二叉树的层序遍历 (中等) - [ ] 42. 将有序数组转换为二叉搜索树 (简单) - [ ] 43. 验证二叉搜索树 (中等) - [ ] 44. 二叉搜索树中第 K 小的元素 (中等) - [ ] 45. 二叉树的右视图 (中等) - [ ] 46. 二叉树展开为链表 (中等) - [ ] 47. 从前序与中序遍历序列构造二叉树 (中等) - [ ] 48. 路径总和 III (中等) - [ ] 49. 二叉树的最近公共祖先 (中等) - [ ] 50. 二叉树中的最大路径和 (困难) ### 九,图论 - [ ] 51. 岛屿数量 (中等) - [ ] 52. 腐烂的橘子 (中等) - [ ] 53. 课程表 (中等) - [ ] 54. 实现 Trie(前缀树) (中等) ### 十,回溯 - [ ] 55.全排列(中等) - [ ] 56.子集(中等) - [ ] 57.电话号码的字母组合(中等) - [ ] 58.组合总和(中等) - [ ] 59.括号生成(中等) - [ ] 60.单词搜索(中等) - [ ] 61.分割回文串(中等) - [ ] 62.N 皇后 (困难) ### 十一,二分查找 - [ ] 63. 搜索插入位置 (简单) - [ ] 64. 搜索二维矩阵 (中等) - [ ] 65. 在排序数组中查找元素的第一个和最后一个位置 (中等) - [ ] 66. 搜索旋转排序数组 (中等) - [ ] 67. 寻找旋转排序数组中的最小值 (中等) - [ ] 68. 寻找两个正序数组的中位数 (困难) ### 十二,栈 - [ ] 69. 有效的括号 (简单) - [ ] 70. 最小栈 (中等) - [ ] 71. 字符串解码 (中等) - [ ] 72. 每日温度 (中等) - [ ] 73. 柱状图中最大的矩形 (困难) ### 十三,堆 - [ ] 74. 数组中的第K个最大元素 (中等) - [ ] 75. 前K 个高频元素 (中等) - [ ] 76. 数据流的中位数 (闲难) ### 十四,贪心算法 - [ ] 77. 买卖股票的最佳时机 (简单) - [ ] 78. 跳跃游戏 (中等) - [ ] 79. 跳跃游戏 III (中等) - [ ] 80. 划分字母区间 (中等) ### 十五,动态规划 - [ ] 81. 爬楼梯(简单) - [ ] 82. 杨辉三角 (简单) - [ ] 83. 打家劫舍 (中等) - [ ] 84. 完全平方数 (中等) - [ ] 85. 零钱兑换 (中等) - [ ] 86. 单词拆分 (中等) - [ ] 87. 最长递增子序列 (中等) - [ ] 88. 乘积最大子数组 (中等) ### 十六,多维动态规划 - [ ] 91. 不同路径 (中等) - [ ] 92. 最小路径和 (中等) - [ ] 93. 最长回文子串 (中等) - [ ] 94. 最长公共子序列 (中等) - [ ] 95. 编辑距离 (中等) ### 十七,技巧 - [ ] 96. 只出现一次的数字 (简单) - [ ] 97. 多数元素 (简单) - [ ] 98. 颜色分类 (中等) - [ ] 99. 下一个排列 (中等) - [ ] 100. 寻找重复数 (中等) 如何使用
最新发布
07-20
<think>嗯,用户想用Python验证回文字符串,我需要仔细想想怎么回答这个问题。首先,回文字符串的定义是正读和反读都一样的字符串,比如“level”或者“madam”。那Python里怎么实现呢?常见的思路可能是反转字符串然后比较是否相同。不过用户提供的引用里提到了不同的方法,我需要参考一下。 引用3和引用4中的方法都是先处理字符串,比如转小写、去除非字母数字字符,然后比较反转后的字符串。比如使用string == string[::-1]。这种方法简单直接,应该是最常见的做法。那用户可能需要一个这样的基本实现。 另外,引用5提到的是逐个比较字符的方法,比如比较第i个和倒数第i个字符。这种方法可能更高效,特别是当字符串很长时,可以在发现不匹配时提前终止,不需要反转整个字符串。不过对于大多数情况,直接反转可能更简洁。 用户的需求是编写验证回文的函数,可能需要考虑不同情况,比如是否忽略大小写、空格和标点符号。根据引用中的例子,处理字符串的步骤包括转换为小写、去除非字母数字字符。所以,在函数中应该包含这些预处理步骤。 比如,用户给出的例子"A man, a plan, a canal: Panama",处理后会变成"amanaplanacanalpanama",这时候反转比较就容易了。所以,代码中需要用到lower()和isalnum()来处理字符串。 另外,用户可能关心不同方法的优缺点。比如,反转字符串的方法虽然简洁,但会创建新的字符串,可能占用更多内存。而逐个比较的方法则不需要额外空间,但代码稍复杂。可能需要根据具体情况选择合适的方法。 然后,我需要组织回答的结构。先介绍回文的定义,然后给出几种不同的实现方法,每种方法的步骤和代码示例。还要注意代码格式是否正确,比如使用$...$和$$...$$的规则,但这里可能主要是Python代码块。不过根据系统指令,数学表达式需要正确使用LaTeX格式,但代码块可能用三个反引号包裹。 还要生成相关问题,比如如何忽略大小写和标点,不同方法的性能比较,或者如何处理特殊字符等。这样用户可以有进一步的问题参考。 总结步骤应该是: 1. 预处理字符串:转小写,去除非字母数字。 2. 比较处理后的字符串与其反转是否相同。 3. 或者逐个字符比较,减少内存使用。 然后给出对应的代码例子,并说明各自的优缺点。最后生成相关问题。</think>### Python验证回文字符串实现方法 #### 一、核心实现原理 回文字符串验证需要满足:**处理后的字符串与其反转完全一致**。需先进行数据预处理: 1. 忽略大小写:使用$string.lower()$统一为小写 2. 过滤非字母数字字符:使用$isalnum()$函数筛选有效字符[^4] 3. 判断对称性:比较处理后的字符串与反转字符串是否相同 #### 二、具体实现步骤 ##### 方法1:字符串反转法 ```python def is_palindrome(s: str) -> bool: # 预处理:去除非字母数字字符并转小写 processed_str = ''.join(ch.lower() for ch in s if ch.isalnum()) # 判断是否等于反转字符串 return processed_str == processed_str[::-1] ``` **时间复杂度**:$O(n)$,空间复杂度$O(n)$[^3] ##### 方法2:双指针验证法 ```python def is_palindrome(s: str) -> bool: processed_str = ''.join(ch.lower() for ch in s if ch.isalnum()) left, right = 0, len(processed_str)-1 while left < right: if processed_str[left] != processed_str[right]: return False left += 1 right -= 1 return True ``` **优点**:提前终止无效比较,节省时间[^5] #### 三、关键代码说明 1. `ch.isalnum()`过滤标点符号和空格[^4] 2. `[::-1]`通过切片操作实现字符串反转 3. `lower()`统一字符大小写避免误判 #### 四、测试用例验证 ```python print(is_palindrome("A man, a plan, a canal: Panama")) # True print(is_palindrome("race a car")) # False print(is_palindrome("level")) # True print(is_palindrome("0P")) # False ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值