📌  相关文章
📜  国际空间研究组织 | ISRO CS 2016 |问题 42(1)

📅  最后修改于: 2023-12-03 14:50:47.570000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2016 |问题 42

这是国际空间研究组织 ISRO 在 2016 年的计算机科学考试的第 42 题。该题目是一个编程题目,需要求出输入字符串的最长连续重复子串。

题目描述

给定一个字符串 s,找出 s 中最长的连续重复子串(该子串至少出现两次)。

样例

输入:

banana

输出:

ana
解题思路

该题可以用双指针算法来解决。我们要找到最长连续重复子串,就可以从字符串的前面开始遍历,依次找到每一个位置的最大重复长度,最终取最大值。

具体实现时,我们可以设置两个指针 i 和 j,分别指向字符串的首尾位置,然后使用哈希表来保存字符在字符串中的位置,当 j 指向的字符出现重复时,就可以计算此时的最大重复长度并更新最大值,然后将 i 指针移到重复字符的下一个位置继续遍历。

代码实现
def longest_repeated_substring(s: str) -> str:
    max_len = 0
    max_substring = ''

    substring_pos = {}

    i = 0
    j = 0

    while j < len(s):
        if s[j] in substring_pos:
            pos = substring_pos[s[j]]
            if i <= pos < j:
                l = j - i
                if l > max_len:
                    max_len = l
                    max_substring = s[i:j]
                i = pos + 1
        substring_pos[s[j]] = j
        j += 1

    return max_substring

该代码使用了双指针算法并使用哈希表来保存字符位置,时间复杂度为 O(n),空间复杂度为 O(n)。