leetcode125. 验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = “A man, a plan, a canal: Panama”
输出:true
解释:“amanaplanacanalpanama” 是回文串。
示例 2:
输入:s = “race a car”
输出:false
解释:“raceacar” 不是回文串。
示例 3:
输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 “” 。
由于空字符串正着反着读都一样,所以是回文串。
题目分析
这个题目要求我们判断一个链表是否为回文。一个回文链表是指从前往后和从后往前读都相同的链表。
算法介绍
这里使用的是两指针法。算法分为两个阶段:正向遍历和双指针遍历。
- 正向遍历:首先,我们需要将链表中的所有字符都转换为小写,然后去除所有非字母和数字的字符。
- 双指针遍历:接下来,我们再次遍历处理后的链表,比较前半部分和后半部分是否相同。
算法步骤
正向遍历
- 转换为小写:将链表中的所有字符都转换为小写。
- 去除非字母和数字:去除所有非字母和数字的字符。
双指针遍历
- 比较前半部分和后半部分:比较处理后的链表的前半部分和后半部分是否相同。
算法流程图
算法分析
- 时间复杂度:O(n),其中n是链表的长度。
- 空间复杂度:O(1),只需要常数级别的额外空间。
- 易错点:在处理字符串时,需要注意字符的转换和去除非字母和数字字符的准确性。
- 注意点:题目要求我们只使用常数级别的额外空间,所以在实现算法时,需要注意不要使用额外的数据结构。
相似题目
题目 | 链接 |
---|---|
反转链表 | 反转一个单链表。 |
两数之和 | 给定一个整数数组和一个目标值,找出数组中和为目标值的两个整数。 |