验证回文串
题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
解法一
解题思路
利用 双指针
的方式。
- 先通过正则表达式,将目标字符串中的特殊字符移除;
- 通过
toLowerCase
方法将字母转换为小写; - 将字符串分割为数组,在头尾各放置一个指针,并遍历数组。如果左右指针指向的值都相等,则说明是回文串,否则就不是回文串。
/**
* @param {string} s
* @return {boolean}
*/
function isPalindrome (s: string): boolean {
// 如果s是空串,返回true
if (s === '') return true
// 将字符串中的所有其他字符转换成'' [A-Z0-9a-z]
const _s = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase()
// 双指针
for (let i = 0; i < _s.length; i++) {
if (i <= s.length / 2 - 1) {
if (_s[i] !== _s[_s.length - 1 - i]) return false
}
}
return true
}
解法二
解题思路
- 先通过正则表达式,将目标字符串中的特殊字符移除;
- 通过
toLowerCase
方法将字母转换为小写; - 将字符串分割为数组,将数组
reverse
后,再join
成字符串,如果跟原字符串一致,则说明是回文串,否则就不是。
/**
* @param {string} s
* @return {boolean}
*/
function isPalindromeByReverse (s: string): boolean {
// 如果s是空串,返回true
if (s === '') return true
// 将字符串中的所有其他字符转换成'' [A-Z0-9a-z]
const _s = s.replace(/[^0-9a-zA-Z]/g, '').toLowerCase()
// 将字母小写,反转后合并,看看跟原先的字符串是否相等
return _s.split('').reverse().join('') === _s
}