唉。。这个之前的代码是这样的写的
结果

测试用例的字符串是
"aguokepatgbnvfqmgmlcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupuculmgmqfvnbgtapekouga"
删除掉干扰因素
lcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupucul
我之前一直以为 左边的+1下一位如果和右边相等的话 就应该删掉左边的因素
但是像这个测试用例 左边删掉之后 下一位和右边相等 但是后续的就不相等了
反倒是右边的删除之后 是个完整的回文字符串。。
所以。。正确的做法。。就是去掉左边或者右边的情况下 去判断是否是回文字符串
左右两种情况 有一种符合即可。。
func validPalindrome(_ s: String) -> Bool {
var left = 0
var right = s.count - 1
let array = Array(s)
let len = array.count
var count = 0
while left < right {
if array[left] == array[right] {
left += 1
right -= 1
}
else if (left + 1 <= right ) && (left + 1 < len) && (array[ left + 1] == array[right]) {
left += 1
count += 1
}
else if (right - 1 >= 0) && (array[right - 1] == array[left]) {
right -= 1
count += 1
}else {
return false
}
if count > 1 {
return false
}
}
return true
}
正确的代码
func validPalindrome(_ s: String) -> Bool {
var left = 0
var right = s.count - 1
let array = Array(s)
while left < right {
if array[left] == array[right] {
left += 1
right -= 1
} else {
return valid(array,left + 1,right) || valid(array,left,right - 1)
}
}
return true
}
func valid(_ array:Array<Character>,_ left:Int ,_ right:Int) -> Bool {
var start = left
var end = right
while start < end {
if array[start] == array[end] {
start += 1
end -= 1
}else {
return false
}
}
return true
}
网友评论