剑指OfferII020.回文子字符串的个数

题目

给定一个字符串 s ,请计算这个字符串中有多少个回文子字符串。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:输入:s = "abc" 输出:3

解释:三个回文子串: "a", "b", "c"

示例 2:输入:s = "aaa" 输出:6

解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"

提示:1 <= s.length <= 1000

s 由小写英文字母组成

注意:本题与主站 647 题相同:

解题思路分析

1、中心扩展;时间复杂度O(n^2),空间复杂度O(1)

剑指OfferII020.回文子字符串的个数

func countSubstrings(s string) int {
   n := len(s)
   res := 0
   for i := 0; i < 2*n-1; i++ {
      left, right := i/2, i/2+i%2
      for ; 0 <= left && right < n && s[left] == s[right]; left, right = left-1, right+1 {
         res++
      }
   }
   return res
}

2、Manacher算法;时间复杂度O(n^2),空间复杂度O(1)

func countSubstrings(s string) int {
   if len(s) <= 1 {
      return len(s)
   }
   str := add(s)
   length := len(str)
   res := 0
   for i := 0; i < length; i++ {
      curLength := search(str, i)
      res = res + curLength/2 + curLength%2
   }
   return res
}

func add(s string) string {
   var res []rune
   for _, v := range s {
      res = append(res, '#')
      res = append(res, v)
   }
   res = append(res, '#')
   return string(res)
}

func search(s string, center int) int {
   i := center - 1
   j := center + 1
   step := 0
   for ; i >= 0 && j < len(s) && s[i] == s[j]; i, j = i-1, j+1 {
      step++
   }
   return step
}

3、Manacher算法;时间复杂度O(n),空间复杂度O(n)

func countSubstrings(s string) int {
   var res []rune
   res = append(res, '#39;)
   for _, v := range s {
      res = append(res, '#')
      res = append(res, v)
   }
   res = append(res, '#')
   res = append(res, '!')
   str := string(res)
   n := len(str) - 1
   arr := make([]int, n)
   leftMax, rightMax, result := 0, 0, 0
   for i := 1; i < n; i++ {
      if i <= rightMax {
         arr[i] = min(rightMax-i+1, arr[2*leftMax-i])
      } else {
         arr[i] = 1
      }
      for str[i+arr[i]] == str[i-arr[i]] {
         arr[i]++
      }
      if i+arr[i]-1 > rightMax {
         leftMax = i
         rightMax = i + arr[i] - 1
      }
      result = result + arr[i]/2
   }
   return result
}

func min(a, b int) int {
   if a > b {
      return b
   }
   return a
}

4、动态规划;时间复杂度O(n^2),空间复杂度O(n^2)

func countSubstrings(s string) int {
   if len(s) <= 1 {
      return len(s)
   }
   dp := make([][]bool, len(s))
   res := 0
   for r := 0; r < len(s); r++ {
      dp[r] = make([]bool, len(s))
      dp[r][r] = true
      res++
      for l := 0; l < r; l++ {
         if s[l] == s[r] && (r-l <= 2 || dp[l+1][r-1] == true) {
            dp[l][r] = true
         } else {
            dp[l][r] = false
         }
         if dp[l][r] == true {
            res++
         }
      }
   }
   return res
}

5、暴力法;时间复杂度O(n^3),空间复杂度O(1)

func countSubstrings(s string) int {
   if len(s) <= 1 {
      return len(s)
   }
   res := len(s)
   for i := 0; i < len(s)-1; i++ {
      for j := i + 1; j < len(s); j++ {
         if s[i] == s[j] && judge(s, i, j) == true {
            res++
         }
      }
   }
   return res
}

func judge(s string, i, j int) bool {
   for i <= j {
      if s[i] != s[j] {
         return false
      }
      i++
      j--
   }
   return true
}

总结

Medium题目,题目同leetcode 647.回文子串,类似的题目还有 leetcode 5.最长回文子串

展开阅读全文

页面更新:2024-03-12

标签:回文   字符串   复杂度   示例   字符   个数   暴力   最长   题目   类似   提示   位置   结束   时间   动态   科技   空间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top