一、题目描述
给你一个字符串 s,最多 可以从中删除一个字符。
请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。
示例 1:
输入: s = "aba"
输出: true
示例 2:
输入: s = "abca"
输出: true
解释: 你可以删除字符 'c' 。
示例 3:
输入: s = "abc"
输出: false
提示:
1 <= s.length <= 105s由小写英文字母组成
二、思路分析
一开始我想着是每截取一个字符串,然后在拼接起来,验证是否是回文串,但是这样太过繁琐,所以只需要判断:
- 如果
s[i] !== s[j]时,只需要判断前一个的匹配或者是后一个的匹配即可 - 下标
i和j-1这一段是否是回文串 或者是 下标i+1和j这一段是否是回文串
三、代码答案
/**
* @param {string} s
* @return {boolean}
*/
var validPalindrome = function (s) {
let i = 0, j = s.length - 1;
while (i < j) {
if (s[i] !== s[j]) {
return isPali(s, i, j-1) || isPali(s, i+1, j)
}
i++
j--
}
return true
};
function isPali(s, i, j) {
while (i < j) {
if (s[i] !== s[j]) return false
i++
j--
}
return true
}