目录

0522:最长特殊序列 II(★)

力扣第 522 题

题目

给定字符串列表 strs ,返回其中 最长的特殊序列 的长度。如果最长特殊序列不存在,返回 -1

特殊序列 定义如下:该序列为某字符串 独有的子序列(即不能是其他字符串的子序列)

s子序列可以通过删去字符串 s 中的某些字符实现。

  • 例如,"abc""aebdc" 的子序列,因为您可以删除"aebdc"中的下划线字符来得到 "abc""aebdc"的子序列还包括"aebdc""aeb""" (空字符串)。

示例 1:

输入: strs = ["aba","cdc","eae"]
输出: 3

示例 2:

输入: strs = ["aaa","aaa","aa"]
输出: -1

提示:

  • 2 <= strs.length <= 50
  • 1 <= strs[i].length <= 10
  • strs[i] 只包含小写英文字母

分析

  • 若 s 本身不是特殊序列,那 s 的子序列也都不是
  • 因此对每一个 s,判断是否是其它某个字符串的子序列即可
  • 显然只需要遍历长度 >= s 的字符串
  • 因此可以先按长度从大到小排序,找到符合的即可返回
  • 判断是否子序列即是 0392

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Solution:
    def findLUSlength(self, strs: List[str]) -> int:
        def check(s,t):
            it = iter(t)
            return all(c in it for c in s)

        ct = Counter(strs)
        A = sorted(ct,key=len)[::-1]
        for i,a in enumerate(A):
            if ct[a]==1 and all(not check(A[i],A[j]) for j in range(i)):
                return len(a)
        return -1

38 ms