题目描述
思路解析动画文字版
记住「逐个串去比,被别人包含就淘汰,扛过所有人就特殊」,下面每一帧都在套它。
轮到第 0 个串 "aba" 当候选。逐个拿别的串去试:只要它是某个串的子序列就被淘汰,全扛住才算特殊。
t 的第 0 位 "c" 不是候选要找的 "a",i 指针不动,j 继续右移找下一个。
t 的第 1 位 "d" 不是候选要找的 "a",i 指针不动,j 继续右移找下一个。
t 的第 2 位 "c" 不是候选要找的 "a",i 指针不动,j 继续右移找下一个。
整个 "cdc" 扫完了,"aba" 没能被它完整包含,"aba" 不是 "cdc" 的子序列。继续拿下一个串来比。
t 的第 0 位 "a" 正好等于候选要找的 "a",命中!候选已匹配 1/3 个字符。
t 的第 1 位 "b" 正好等于候选要找的 "b",命中!候选已匹配 2/3 个字符。
t 的第 2 位 "a" 正好等于候选要找的 "a",命中!候选已匹配 3/3 个字符。"aba" 被 "aba" 完整包含了。
候选 "aba" 被 "aba" 完整包含,它不是独有的,整串标红淘汰。
轮到第 1 个串 "cdc" 当候选。逐个拿别的串去试:只要它是某个串的子序列就被淘汰,全扛住才算特殊。
t 的第 0 位 "a" 不是候选要找的 "c",i 指针不动,j 继续右移找下一个。
t 的第 1 位 "b" 不是候选要找的 "c",i 指针不动,j 继续右移找下一个。
t 的第 2 位 "a" 不是候选要找的 "c",i 指针不动,j 继续右移找下一个。
整个 "aba" 扫完了,"cdc" 没能被它完整包含,"cdc" 不是 "aba" 的子序列。继续拿下一个串来比。
又一个 "aba",和刚才比过的那个完全相同,"cdc" 的第一个字符 "c" 在里面照样找不到,直接跳过。
t 的第 0 位 "a" 不是候选要找的 "c",i 指针不动,j 继续右移找下一个。
t 的第 1 位 "b" 不是候选要找的 "c",i 指针不动,j 继续右移找下一个。
整个 "ab" 扫完了,"cdc" 没被它完整包含。所有对手都比完了,没人包含 "cdc",准备判它是特殊序列。
候选 "cdc" 扛过了所有对手,谁也包不住它,它就是特殊序列!整串标绿,用它的长度 3 刷新答案为 3。
轮到第 2 个串 "aba" 当候选。逐个拿别的串去试:只要它是某个串的子序列就被淘汰,全扛住才算特殊。
t 的第 0 位 "a" 正好等于候选要找的 "a",命中!候选已匹配 1/3 个字符。
t 的第 1 位 "b" 正好等于候选要找的 "b",命中!候选已匹配 2/3 个字符。
t 的第 2 位 "a" 正好等于候选要找的 "a",命中!候选已匹配 3/3 个字符。"aba" 被 "aba" 完整包含了。
候选 "aba" 被 "aba" 完整包含,它不是独有的,整串标红淘汰。
轮到第 3 个串 "ab" 当候选。逐个拿别的串去试:只要它是某个串的子序列就被淘汰,全扛住才算特殊。
t 的第 0 位 "a" 正好等于候选要找的 "a",命中!候选已匹配 1/2 个字符。
t 的第 1 位 "b" 正好等于候选要找的 "b",命中!候选已匹配 2/2 个字符。"ab" 被 "aba" 完整包含了。
候选 "ab" 被 "aba" 完整包含,它不是独有的,整串标红淘汰。
回看全程:两个 "aba" 互为子序列、"ab" 是 "aba" 的子序列,全被淘汰;只有 "cdc" 谁也包不住,它就是最长特殊序列,答案 3。
边界先想清:全相同为 -1、互不包含取最长、短串被长串吃掉。
两个高频追问:和 LC521 的区别、能否排序优化。
参考代码
from __future__ import annotationsfrom typing import *from collections import *from functools import *from itertools import *from math import *from heapq import *from bisect import *class Solution: def findLUSlength(self, strs: List[str]) -> int: def check(s: str, t: str): i = j = 0 while i < len(s) and j < len(t): if s[i] == t[j]: i += 1 j += 1 return i == len(s) ans = -1 for i, s in enumerate(strs): for j, t in enumerate(strs): if i != j and check(s, t): break else: ans = max(ans, len(s)) return ans复杂度
- 时间:O(n² · L),n 个串两两比较,每次子序列判定 O(L)
- 空间:O(1),只用双指针 i、j 和记分变量
易错点
面试追问把动画讲成自己的话
追问这题和「最长特殊序列 I」(LC521)有什么区别?
追问能不能先排序来优化?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
通过删除字母匹配到字典里最长单词
LeetCode 524 · 中等 · 沿着 双指针套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题