0467. 环绕字符串中唯一的子字符串
大约 1 分钟
---
0467. 环绕字符串中唯一的子字符串
- 标签:字符串、动态规划
- 难度:中等
题目链接
题目大意
把字符串 s 看作是 abcdefghijklmnopqrstuvwxyz 的无限环绕字符串,所以 s 看起来是这样的:...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....。
给定一个字符串 p。
要求:你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 s 中 p 的不同的非空子串的数目。
注意: p 仅由小写的英文字母组成,p 的大小可能超过 10000。
解题思路
字符串 s 是个 a ~ z 无限循环的字符串,题目要求计算字符串 s 和字符串 p 中有多少个相等的非空子串。发现以该字符结尾的连续子串的长度,就等于以该字符结尾的相等子串的个数。所以我们可以按以下步骤求解:
- 记录以每个字符结尾的字符串最长长度。
- 将其累加起来就是最终答案。
代码
class Solution:
def findSubstringInWraproundString(self, p: str) -> int:
dp = collections.defaultdict(int)
dp[p[0]] = 1
max_len = 1
for i in range(1, len(p)):
if (ord(p[i]) - ord(p[i - 1])) % 26 == 1:
max_len += 1
else:
max_len = 1
dp[p[i]] = max(dp[p[i]], max_len)
ans = 0
for key, value in dp.items():
ans += value
return ans