![]() LC 467. 环绕字符串中唯一的子字符串
             (opens new window) (opens new window)
 
            LC 467. 环绕字符串中唯一的子字符串
             (opens new window) (opens new window) 
 中等 
# 问题描述
把字符串 s 看作是 "abcdefghijklmnopqrstuvwxyz" 的无限环绕字符串,所以 s 看起来是这样的:
"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd...."
现在给定另一个字符串 p 。返回出现在 s 中 p 的 唯一非空子串 的数量 。
示例 1:
输入: p = "a"
输出: 1
解释: 字符串 s 中只有一个"a"子字符。
示例 2:
输入: p = "cac"
输出: 2
解释: 字符串 s 中的字符串“cac”只有两个子串“a”、“c”。
示例 3:
输入: p = "zab"
输出: 6
解释: 在字符串 s 中有六个子串“z”、“a”、“b”、“za”、“ab”、“zab”。
提示:
- 1 <= p.length <= 105
- p由小写英文字母构成
# 动态规划
设 为以 结尾的最长有效子字符串的长度, 为 中以英文字母 结尾的最长子字符串长度。
对于 有以下状态转移方程:
对于 ,有:
最终答案为:
由于 只与 相关,可以使用变量 进行压缩。
/**
 * @param {string} p
 * @return {number}
 */
var findSubstringInWraproundString = function (p) {
  const count = new Array(26).fill(0)
  const n = p.length
  const base = 'a'.charCodeAt(0)
  count[p.charCodeAt(0) - base] = 1
  let k = 1
  for (let i = 1; i < n; i++) {
    const alpha = p.charCodeAt(i) - base
    const beta = p.charCodeAt(i - 1) - base
    const diff = alpha - beta
    if (diff === 1 || diff === -25) {
      k++
    } else {
      k = 1
    }
    count[alpha] = Math.max(count[alpha], k)
  }
  return count.reduce((sum, curr) => sum + curr, 0)
}
- 时间复杂度:
- 空间复杂度:
上次更新: 2023/01/31 19:48:05
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!