目录

1316:不同的循环子字符串(1836 分)

力扣第 17 场双周赛第 4 题

题目

给你一个字符串 text ,请你返回满足下述条件的 不同 非空子字符串的数目:

  • 可以写成某个字符串与其自身相连接的形式(即,可以写为 a + a,其中 a 是某个字符串)。

例如,abcabc 就是 abc 和它自身连接形成的。

示例 1:

输入:text = "abcabcabc"
输出:3
解释:3 个子字符串分别为 "abcabc","bcabca" 和 "cabcab" 。

示例 2:

输入:text = "leetcodeleetcode"
输出:2
解释:2 个子字符串为 "ee" 和 "leetcodeleetcode" 。

提示:

  • 1 <= text.length <= 2000
  • text 只包含小写英文字母。

相似问题:

分析

  • 遍历子串,判断是否符合,并用哈希表去重即可
  • 判断符合可以用 lcp

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Solution:
    def distinctEchoSubstrings(self, text: str) -> int:
        n = len(text)
        f = [[0]*(n+1) for _ in range(n)]
        res = set()
        for i in range(n-2,-1,-1):
            for j in range(i+1,n):
                f[i][j] = 0 if text[i]!=text[j] else 1+f[i+1][j+1] 
                if f[i][j]>=j-i:
                    res.add(text[i:j])
        return len(res)

1295 ms

*附加

还有种后缀数组的做法