680. 验证回文字符串 Ⅱ

image.png

1 判断回文可以使用双指针,也就是一个指向字符串的首位,向左移动, 一个指向字符串的尾部,向右移动
2 当出现指针指向的字符不相同的时候,可以把左边的字符移动一位s[left+1:right+1],或者把右边字符移动一位s[left:right] ,注意:go中字符区间是左闭右开的。
3 然后分别对当前的区间段的字符是否是回文字符串判断
4 因为判断的函数还是做双指针判断 ,非常符合递归把大问题化解成小问题,然后用小问题的结果来解决大问题的结果。

  1. 代码
  2. 递归形式
  3. func validPalindrome(s string) bool {
  4. return palindromeHelp(s,true)
  5. }
  6. func palindromeHelp(s string,isDelete bool)bool{
  7. left :=0
  8. right :=len(s)-1
  9. for left<right{
  10. if s[left]!=s[right]{
  11. if isDelete{
  12. return palindromeHelp(s[left:right],false)||palindromeHelp(s[left+1:right+1],false)
  13. }else {
  14. return false
  15. }
  16. }
  17. left++
  18. right--
  19. }
  20. return true
  21. }
  22. 非递归的形式
  23. func validPalindrome(s string) bool {
  24. left :=0
  25. right :=len(s)-1
  26. for left<right{
  27. if s[left]!=s[right]{
  28. return isPalindrome(s[left:right])||isPalindrome(s[left+1:right+1])
  29. }
  30. left++
  31. right--
  32. }
  33. return true
  34. }
  35. func isPalindrome(s string)bool{
  36. left :=0
  37. right :=len(s)-1
  38. for left<right{
  39. if s[left]!=s[right]{
  40. return false
  41. }
  42. left++
  43. right--
  44. }
  45. return true
  46. }