647. 回文子串
回文子串
题目描述:
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。
回文字符串 是正着读和倒过来读一样的字符串。
子字符串 是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例 1:
输入:s = “abc”
输出:3
解释:三个回文子串: “a”, “b”, “c”
示例 2:
输入:s = “aaa”
输出:6
解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”
提示:
1 <= s.length <= 1000
s 由小写英文字母组成
思路:
使用马拉车算法,时间复杂度o(n),动态维护左边界和右边界
代码:
func countSubstrings(s string) int {
n := len(s)
t := "$#"
for i:=0; i<n; i++{
t+=string(s[i])+"#"
}
n = len(t)
t+="!"
dp := make([]int, n)
iMax,rMax,ans := 0,0,0
for i:=1;i<n;i++{
if rMax >=i{
dp[i] = min(rMax-i+1, dp[iMax*2-i])
}else{
dp[i] = 1
}
for t[dp[i]+i] == t[i-dp[i]]{
dp[i] = dp[i]+1
}
if i+dp[i] -1 >rMax{
iMax = i
rMax = dp[i]+i-1
}
ans += dp[i]/2
}
return ans
}
func min(a , b int)int{
if a>b{
return b
}
return a
}
代码效率:
执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:4.7 MB, 在所有 Go 提交中击败了10.15%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!