【题目】
给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。
子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。
输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -1 。
示例:
输入: "aba", "cdc", "eae"
输出: 3
提示:
【思路】
稍微一变,题就变得很难。
还记得【T78-最长特殊序列 Ⅰ】这道题吗?对于两个单词,当单词一样,返回-1;否则,返回他们的最长单词长度。
对于多个单词,只有单词出现次数为1的,才可能满足条件。
但是,并不是简单取最长单词长度就行了。
想一想,当数组为[“aba”, "aba", "ab"],虽然“aba”由于出现次数不为1,不满足条件,“ab”因为是“aba”的子序列,也不满足条件。
因此,还需要判断单词是否为其他单词的子序列。
代码中,按照单词长度进行排序,这样,可以省去很多判断子序列的操作。
【代码】
python版本
def is_subseq(word1, word2):
k =
count =
# word2的所有字符是否依次出现在word1中
for w in word2:
while k < len(word1) and word1[k] != w:
k +=
if k >= len(word1):
break
count +=
k +=
if count == len(word2):
return True
return False
class Solution(object):
def findLUSlength(self, strs):
"""
:type strs: List[str]
:rtype: int
"""
# 词频统计
d = {}
for s in strs:
d[s] = d.get(s, ) +
# 找到最大单词长度,条件是:该单词出现次数为1次,且不是任何单词的子序列
item = list(d.items())
item.sort(key=lambda x: (len(x[]), x[]), reverse=True)
flag = False
for i in range(len(item)):
# 只出现1次
if item[i][] == :
# 不是其他单词的子序列
flag = False
word2 = item[i][]
for j in range(len(item)):
word1 = item[j][]
# 单词必须长度更长,才可能有该子序列
if len(word1) <= len(word2):
break
# 判断是否是子序列,如果是,单词word2不可能
if is_subseq(word1, word2):
flag = True
break
if not flag:
return len(item[i][])
return -1