题目
Github链接
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: s = “aba” 输出: true
示例 2:输入: s = “abca” 输出: true 解释: 你可以删除c字符。
- 思路
- 双指针,左右移动指针,看是否相等
- 注意不要删除左右两边的元素,虽然删除数组的最后一个元素的复杂度是O(1),但是删除数组的第一个元素复杂度是O(n)
- 跳过左边或右边,都要考虑一次
代码如下:
func validPalindrome(_ s: String) -> Bool {
var temp = Array(s).map({String($0)})
var isDeleted = false
func helper1( _ left: Int, _ right: Int) -> Bool {
var left = left
var right = right
while left < right {
if temp[left] == temp[right] {
left += 1
right -= 1
} else {
if isDeleted {
return false
}
isDeleted = true
return helper1(left + 1, right) || helper1(left, right - 1) // 删除左边或右边,都要考虑到
}
}
return true
}
return helper1(0, temp.count - 1)
}