680. 验证回文字符串 Ⅱ
1 判断回文可以使用双指针,也就是一个指向字符串的首位,向左移动, 一个指向字符串的尾部,向右移动
2 当出现指针指向的字符不相同的时候,可以把左边的字符移动一位s[left+1:right+1],或者把右边字符移动一位s[left:right] ,注意:go中字符区间是左闭右开的。
3 然后分别对当前的区间段的字符是否是回文字符串判断
4 因为判断的函数还是做双指针判断 ,非常符合递归把大问题化解成小问题,然后用小问题的结果来解决大问题的结果。
代码
递归形式
func validPalindrome(s string) bool {
return palindromeHelp(s,true)
}
func palindromeHelp(s string,isDelete bool)bool{
left :=0
right :=len(s)-1
for left<right{
if s[left]!=s[right]{
if isDelete{
return palindromeHelp(s[left:right],false)||palindromeHelp(s[left+1:right+1],false)
}else {
return false
}
}
left++
right--
}
return true
}
非递归的形式
func validPalindrome(s string) bool {
left :=0
right :=len(s)-1
for left<right{
if s[left]!=s[right]{
return isPalindrome(s[left:right])||isPalindrome(s[left+1:right+1])
}
left++
right--
}
return true
}
func isPalindrome(s string)bool{
left :=0
right :=len(s)-1
for left<right{
if s[left]!=s[right]{
return false
}
left++
right--
}
return true
}