【初级算法|字符串】11-验证回文串

157 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

【初级算法|字符串】11-验证回文串

题目

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。(空字符串定义为有效的回文串)

输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串

思路分析

这道题稍微比较简单,因为需要验证是回文,从左到右的字母和从右到左的字母都是相同的。所以可以使用双指针的方法解决.

  • 建立2个指针,一个是左边指针 l,一个是右边指针 r,分别从字符的开头和结尾遍历整个字符串
  • 如果遇到空格的话或者其他的字符可以直接跳过。
  • 指针指到值如果不相等则可以跳出结束,如果相等则继续

其临界条件就是指针的 l 值小于 r 的值。

AC 代码

function func_exerise8(s) {
    let data = s.split('')
    let l = 0, r = data.length - 1;
    while (l < r) {
        if (!isLetter(data[l])) {
            l++;
        } else if (!isLetter(data[r])) {
            r--;
        } else {
            if (data[l] != data[r]) {
                return false;
            }
            l++;
            r--;
        }
    }
  return true;
}
​
func isLetter(ch){
    return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')
}

总结

对于复杂度的分析,其时间复杂度和空间复杂读都是O(n)。因是对整个字符串的一半进行遍历,所以还是O(n).

有人提出使用递归的方式解决,但递归的方式和以上的方式其实还是差不多的。

题目来源:leetcode-cn.com/leetbook/re…