开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。(空字符串定义为有效的回文串)
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
思路分析
首先需要知道什么是回文,就是从左到右字母和从右到左的字母都是相同的就是回文。所以如果要验证是不是回文的,其实可以用2个指针分别从首尾进行按顺序遍历,一旦遇到不相同的就说明不是回文。 结束条件,就是两个指针指向同一个位置或者是右指针比左指针还要小就说明结束了。
解题步骤
这道题稍微比较简单,从左到右的字母和从右到左的字母都是相同的。所以可以使用双指针的方法解决.
- 建立2个指针,一个是左边指针 l,一个是右边指针 r,分别从字符的开头和结尾遍历整个字符串
- 如果遇到空格的话或者其他的字符可以直接跳过。
- 指针指到值如果不相等则可以跳出结束,如果相等则继续
其临界条件就是指针的 l 值小于 r 的值。
代码实现
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)。