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).
有人提出使用递归的方式解决,但递归的方式和以上的方式其实还是差不多的。