Leetcode 最长重复子串 Python
简介
在解决Leetcode上的算法问题时,常常会遇到需要寻找最长重复子串的情况。最长重复子串是指在一个字符串中,找到连续出现多次的相同字符序列,且该序列的长度最长。本文将介绍如何使用Python来解决这类问题,并且给出一个实际的Leetcode问题作为示例。
解决方法
在解决最长重复子串的问题时,我们可以采用滑动窗口的方法来进行求解。具体步骤如下:
- 定义一个滑动窗口,用于记录当前的字符序列。
- 遍历整个字符串,每次都将当前字符加入滑动窗口。
- 判断当前字符是否与滑动窗口的最后一个字符相同,如果相同,则继续向后遍历。
- 如果不同,则更新最长重复子串的长度,并将滑动窗口移动到当前字符处。
代码示例
下面是一个使用Python实现的最长重复子串的代码示例:
def longestRepeatedSubstring(s):
n = len(s)
res = 0
dp = [[0] * n for _ in range(n)]
for i in range(1, n):
for j in range(i):
if s[i] == s[j]:
dp[i][j] = dp[i-1][j-1] + 1
res = max(res, dp[i][j])
return res
# 测试代码
s = "abcdeabcdeabcde"
print(longestRepeatedSubstring(s))
在这段代码中,我们定义了一个函数longestRepeatedSubstring
,它接收一个字符串s
作为输入,并返回最长重复子串的长度。我们首先初始化了一个二维数组dp
,用于记录每个位置上的最长重复子串长度。然后通过动态规划的方法,遍历整个字符串,更新dp
数组中的值,最终得到最长重复子串的长度。
Leetcode示例
作为一个实际的Leetcode问题,我们来看一道题目,[Leetcode 1062: Longest Repeating Substring](
题目描述
给定一个字符串S
,找出其中最长的重复子串的长度。如果不存在重复子串,则返回0。
示例
输入: "abcd"
输出: 0
解释: 没有重复子串。
输入: "abbaba"
输出: 2
解释: 最长的重复子串为"ab",长度为2。
解题思路
我们可以通过二分搜索的方法来解决这个问题。首先确定重复子串的长度范围,然后在这个范围内使用滑动窗口来判断是否存在这样的重复子串。
代码示例
以下是一个使用Python解决Leetcode 1062题的代码示例:
def search(s, L):
n = len(s)
seen = set()
MOD = 2**63 - 1
BASE = 26
baseL = pow(BASE, L, MOD)
hash_value = 0
for i in range(L):
hash_value = (hash_value * BASE + ord(s[i])) % MOD
seen.add(hash_value)
for i in range(1, n - L + 1):
hash_value = (hash_value * BASE - ord(s[i-1]) * baseL + ord(s[i+L-1])) % MOD
if hash_value in seen:
return i
seen.add(hash_value)
return -1
def longestRepeatingSubstring(S):
n = len(S)
left, right = 1, n
while left < right:
mid = (left + right) // 2
if search(S, mid) != -1:
left = mid + 1
else:
right = mid
return left - 1
# 测试代码
S = "abbaba"
print(longestRepeatingSubstring(S))
总结
通过本文的介绍,我们了解了最长重复子串的求解方法,并给出了一个实际的Leetcode问题作为示例。在解决