Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode今日题目第680题-验证回文字符串
一、题目描述
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例1
输入: s = "aba"
输出: true
示例2
输入: s = "abca"
输出: true
解释: 你可以删除c字符。
二、思路分析
什么是回文字符串?
关于中心左右对称的字符串。例如:ABCBA或者AACCAA是回文字符串;ABCCA或者AABBCC不是回文字符串。
判断方法就是,依次看两端的字符是否相等。例如:ABCBA,第一个字符与最后一个字符相等,第二个字符与倒数第二个字符相等,第三个字符是中心字符,无需判断。如果是AACCAA就要判断。所以上面的字符串是回文字符串。大家可以试试这个题:125. 验证回文串,这个题目搞懂了,本题就迎刃而解了。
解题思路
- 从字符串的两端开始向里逐步比较两个字符串是不是相同
- 如果相同则继续向里移动指针比较里面的两个字符
- 如果不相同,在删除一个字符之后再比较其它的字符就能够形成一个回文
- 由于事先不知道应该删除两个不同字符中的哪一个,因此两个字符都进行尝试
三、JavaScript 代码
var validPalindrome = function (s) {
const len = s.length;
let i = 0,
j = len - 1;
while (i < j && s[i] === s[j]) {
i++;
j--;
}
if (isPalindrome(i + 1, j)) {
return true;
}
if (isPalindrome(i, j - 1)) {
return true;
}
function isPalindrome(st, ed) {
while (st < ed) {
if (s[st] !== s[ed]) {
return false;
}
st++;
ed--;
}
return true;
}
// 默认返回false
return false;
};
四、总结
本题应用的也是指针法来解题。首先判断了这个字符串是不是一个回文字符串,如果不是,删除一个字符,继续判断剩下的字符串是不是一个回文字符串,左右各删除一次,以此类推。
五、最后
我是朽木白,一个热爱分享的程序猿。如果觉得本文还不错,记得点赞+关注❤️