📅  最后修改于: 2023-12-03 14:50:48.057000             🧑  作者: Mango
给定一个字符串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)级别的空间复杂度。