前言
记录一下算法的学习
题目描述
给定一个非空字符串 s
,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
示例1
输入: s = "aba"
输出: true
示例2
输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符
示例3
输入: s = "abc"
输出: false
提示
1 <= s.length <= 105
s
由小写英文字母组成
解题思路
- 在做题之前需要了解什么是回文字符串
- 顺着读和倒着读一样
- 将一个字符串从中间来一刀,左右是对称的
- 如poaaop就是一个回文字字符串
- 了解了什么是回文字符串,可以根据对称性来解题
- 定义两个指针,分别从首尾开始,向内移动,形成对撞指针
- 如果两个值相同,就向内移动,直到不相同为止
- 题目中可以最多删除一个字符,有两个方案,左指针向内移动或者右指针向内移动
- 移动完成后继续对撞比较,只要出现一个不相同,这个字符串就不是回文
代码
/**
* @param {string} s
* @return {boolean}
*/
var validPalindrome = function (s) {
// 回文字符串,从中间开始,对称
let i = 0
let j = s.length - 1
while (i < j && s[i] === s[j]) {
i++
j--
}
const checkPalindrome = (left, right) => {
while (left < right) {
if (s[left] != s[right]) {
return false
}
left++
right--
}
return true
}
if (checkPalindrome(i + 1, j)) return true
if (checkPalindrome(i, j - 1)) return true
return false
};
复杂度分析
- 时间复杂度:需要遍历整个字符串,所以时间复杂度为O(N)
- 空间复杂度:需要两个变量保存指针,所以为O(1)
最后
每天进步一点点