📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 – 5 月 |问题 33(1)

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

ISRO CS 2017 - 5月 - 问题33

题目描述

给定一个字符串S,你需要找到S长度大于2,不存在连续字符的最长子序列。

输入

第一行包含一个整数T,表示测试用例的数量。 对于每个测试用例,都有一个字符串S。

输出

每个测试用例的输出都应该在新的一行中输出并以空格分隔。如果不存在,则输出0。

示例
输入
2 
abcdaabcaa
aab
输出
3
1
说明

对于第一个测试用例,最长的子序列是abc,长度为3。 对于第二个测试用例,唯一的子序列是a,长度为1。

分析

这是一道找最长非重复子序列的问题。我们可以使用滑动窗口的方法来解决它。

我们用两个指针i和j来变换窗口的大小。这个窗口的大小是i-j+1。

我们可以用一个set来存储窗口里的字符。当我们找到一个重复的字符时,我们就移动i指针,并从set里删除字符,直到窗口里不再有重复的字符为止。

在每个移动的步骤中,我们需要更新我们的答案,也就是当前窗口的长度,和以前窗口长度的最大值。

最后我们就可以得到我们要求的答案。

代码
def longest_non_repeating_substring(s: str) -> int:
    n = len(s)
    i = 0
    j = 0
    ans = 0
    charset = set()
    while i < n and j < n:
        if s[j] not in charset:
            charset.add(s[j])
            j += 1
            ans = max(ans, j - i)
        else:
            charset.remove(s[i])
            i += 1
    return ans


if __name__ == '__main__':
    t = int(input())
    for _ in range(t):
        s = input()
        print(longest_non_repeating_substring(s))

这个算法的时间复杂度是O(n),因为我们只遍历了整个字符串一遍。而空间复杂度是O(k),其中k是字符集的大小或者说是窗口的大小。如果字符集很小,比如只有ASCII字符,那么就是O(1)级别的空间复杂度。