题目
给定一个非空字符串 str
,最多删除一个字符。判断是否能成为 回文字符串
。
注意:
字符串只包含从 a-z
的小写字母。字符串的最大长度是 50000
。
假设:
- 输入
aba
,返回true
- 输入
abca
,返回true
- 输入
abeca
,返回false
算法解析
- 利用回文字符串的对称性,可以使用双指针来优化算法。
代码
const validPalindrome = (str) => {
const arr = str.split('')
// 初始化左右指针
let i = 0
let j = arr.length - 1
// 允许被删除
let deleteNum = 1
while(i <= j) {
// 如果左右指针指向的字符相等
if (arr[i] === arr[j]) {
// 再往中间移动
i++
j--
} else {
// 如果之前已经删过一次了,直接返回 false
if (deleteNum < 1) {
return false
}
// 如果删左边指针的字符,能与当前右边的字符相等
if (arr[i + 1] === arr[j]) {
deleteNum--
i = i + 2
j--
} else if (arr[i] === arr[j - 1]) {
// 如果删右边指针的字符,能与当前左边的字符相等
deleteNum--
j = j - 2
i++
} else {
return false
}
}
}
return true
}
网友评论