该题解的思路是先将字符串数组按长度降序排序,然后遍历每个字符串,判断其是否是特殊序列。对于当前遍历到的字符串,如果它比下一个字符串长,那么它一定是特殊序列;否则,如果它不是任何其他字符串的子序列,那么它也是特殊序列。在判断子序列的过程中,可以通过双指针来实现。
时间复杂度: O(nlogn + n^2m^2)
空间复杂度: O(n)
class Solution:
def findLUSlength(self, strs: List[str]) -> int:
def is_sub(s1, s2):
n, m, j = len(s1), len(s2), 0
for i in range(n):
if s1[i] == s2[j]:
j += 1
if j == m:
return True
return False
# 按照长度降序排序字符串数组
strs.sort(key=lambda x: (-len(x), x))
n, deleted = len(strs), set()
for i in range(n):
if i in deleted:
continue
# 如果当前字符串比下一个字符串长,那么它一定是特殊序列
if i + 1 < n and len(strs[i]) > len(strs[i + 1]):
return len(strs[i])
flag = True
for j in range(i + 1, n):
s1, s2 = strs[i], strs[j]
# 判断当前字符串是否为其他字符串的子序列
if is_sub(s1, s2):
deleted.add(j)
# 判断其他字符串是否为当前字符串的子序列
if flag and len(strs[j]) == len(strs[i]) and is_sub(s2, s1):
flag = False
if flag:
return len(strs[i])
return -1