【LeetCode最详尽解答】125-验证回文串 Valid-Palindrome

2024-06-16 08:36

本文主要是介绍【LeetCode最详尽解答】125-验证回文串 Valid-Palindrome,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家!

链接:

  • 125-验证回文串

直觉

这个问题需要使用一些内置函数,比如 s[l].isalnum()s[l].lower()。基本要求简单明了。

例子:

输入: s = "A man, a plan, a canal: Panama"

输出: true

解释: "amanaplanacanalpanama" 是一个回文。

我们可以设置两个指针:一个在输入的开始位置,另一个在末尾位置。左指针始终应小于右指针,因为如果它们在同一位置,我们不需要比较它们。如果左指针大于右指针,这没有意义,并且会生成重复的比较。

我们应该跳过非字母数字字符。如果最初左指针指向一个非字母数字字符,我们应该将其右移,直到遇到第一个字母数字字符。然而,我们不应该继续右移;我们应确保左指针始终小于右指针并且不越界。右指针同样适用。当它们到达正确的位置时,我们将字符转换为小写值并进行比较。如果它们不相同,我们直接返回 False。如果它们相同,我们调整左指针和右指针到新的位置并继续循环。如果我们遍历所有的值,我们只需返回 True

方法

  1. 设置两个指针,leftright
  2. 初始化它们分别为 0len(s) - 1
  3. 确保左指针小于右指针,以避免越界。
  4. 比较左指针和右指针处字符的值。
  5. 如果左指针不是字母数字字符,将其右移;右指针同理。
  6. 比较字符的小写值。如果它们不相同,返回 False
  7. 如果它们相同,移动左指针和右指针并继续循环。

复杂度

  • 时间复杂度:
    O ( n ) O(n) O(n)

    • 该算法最多遍历字符串中的每个字符一次,时间复杂度为线性。
  • 空间复杂度:
    O ( 1 ) O(1) O(1)

    • 该算法使用的额外空间是常数,无论输入大小如何。

代码

class Solution(object):def isPalindrome(self, s):""":type s: str:rtype: bool"""l = 0r = len(s) - 1while l < r:while l < r and not s[l].isalnum():l+=1while l < r and not s[r].isalnum():r-=1if s[l].lower() != s[r].lower():return Falsel+=1r-=1return True

这篇关于【LeetCode最详尽解答】125-验证回文串 Valid-Palindrome的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1065968

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

csu1328(近似回文串)

题意:求近似回文串的最大长度,串长度为1000。 解题思路:以某点为中心,向左右两边扩展,注意奇偶分开讨论,暴力解即可。时间复杂度O(n^2); 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#inclu

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

ural 1297. Palindrome dp

1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The “U.S. Robots” HQ has just received a rather alarming anonymous letter. It states that the agent from the competing «Robots Unli

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return