golang力扣leetcode 467.环绕字符串中唯一的子字符串

简介: golang力扣leetcode 467.环绕字符串中唯一的子字符串

467.环绕字符串中唯一的子字符串

467.环绕字符串中唯一的子字符串

题解

题目:给一个a到z的字符串s,并且定义该字符串s是无限环绕的,即a…xyzabcd…yzabc…,给一个字符串p,问p中的有多少个子串,出现在s中。例如p=cab,则 a,b,c,ab这4个子串在s中出现过

思路:动态规划

p=bcd
b    1(b)
bc   2(c,bc)
bcd  3(d,cd,bcd)
p=cab
c   1(c)
ca  1(a)
cab 2(b,ab)
在周期字符串s中,如果知道了子串的最后一个字符,以及子串长度,那么该字符串就被确定了
题目要求的是不同子串个数,那么对于相同字符结尾的子串,长的子串必定包含短的子串---bcd  abcd
定义dp[i]:在p中以字符串i结尾的子串的 最长长度,知道了最长长度,那么就知道了以i结尾的不同子串的个数了
递推公式:如果p[i]是p[i-1]的下一个字母,则递增k,否则k=1,重新开始计算连续递增的子串长度
dp[p[i]]=max(dp[p[i]],k)
最后再将,以a,b,c..结尾的子串的最长长度相加,就是答案了

代码

func findSubstringInWraproundString(p string) (ans int) {
  dp := [26]int{}
  k := 0
  for i, v := range p {
    if i > 0 && (v-int32(p[i-1])+26)%26==1 {
      k++
    } else {
      k = 1
    }
    dp[v-'a'] = max(dp[v-'a'], k)
  }
  for _, v := range dp {
    ans += v
  }
  return ans
}
func max(a, b int) int {
  if b > a {
    return b
  }
  return a
}
目录
相关文章
|
4天前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
4天前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
4天前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)
|
13天前
|
Go
[golang]字符串拼接
[golang]字符串拼接
|
12天前
|
存储 程序员 编译器
Golang 中的字符串:常见错误和最佳实践
Golang 中的字符串:常见错误和最佳实践
|
2月前
|
算法
力扣每日一题 6/23 字符串/模拟
力扣每日一题 6/23 字符串/模拟
20 1
|
1月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
15 0
|
1月前
|
索引
821.字符的最短距离-力扣(LeetCode)
821.字符的最短距离-力扣(LeetCode)
15 0
|
2月前
|
索引
力扣每日一题 6/27 字符串 贪心
力扣每日一题 6/27 字符串 贪心
14 0
|
2月前
|
Python
力扣随机一题 模拟+字符串
力扣随机一题 模拟+字符串
16 0