给定字符串 S
,找出最长重复子串的长度。如果不存在重复子串就返回 0
。
示例 1:
输入:"abcd"
输出:0
解释:没有重复子串。
示例 2:
输入:"abbaba"
输出:2
解释:最长的重复子串为 "ab" 和 "ba",每个出现 2 次。
示例 3:
输入:"aabcaabdaab"
输出:3
解释:最长的重复子串为 "aab",出现 3 次。
示例 4:
输入:"aaaaa"
输出:4
解释:最长的重复子串为 "aaaa",出现 2 次。
提示:
- 字符串
S
仅包含从'a'
到'z'
的小写英文字母。 1 <= S.length <= 1500
思路:
动态规划,
两重循环,如果当前位匹配上了,就把前一位DP记录下来的结果 + 1 赋给当前位DP。
class Solution(object):
def longestRepeatingSubstring(self, S):
"""
:type S: str
:rtype: int
"""
#动态规划, 用dp{(i, j): length}表示 S[i - length + 1:i + 1] == S[j - length + 1: j + 1]
ans = 0
dp = {}
for i in range(len(S)):
for j in range(i + 1, len(S)):
if S[i] == S[j]:
dp[(i,j)]=dp.get((i-1,j-1),0)+1
# print i, j, dp[(i, j)]
ans=max(ans,dp[(i,j)])
return ans