求:
给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。
子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。
输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -1 。
示例:
输入: "aba", "cdc", "eae"
输出: 3
提示:
所有给定的字符串长度不会超过 10 。
给定字符串列表的长度将在 [2, 50 ] 之间。
解:
思路:这是leetcode521的变形题,2个字符串的比较变成了字符串数组的比较,但思路基本一致。(可以把2个字符串看做字符串数组的简化情形)
针对字符串数组,逐个检索字符串,判断它是否是某个字符串数组中的字符串的子串,如果都不是,判断它的长度是否大于当前记录的最大子序列长度,如果大于最大子序列长度,则更新最大子序列长度。完成字符串数组的遍历后,返回即可。注意这里子序列的定义,此处的包含并不是连续的包含字符,所以不能使用strstr库函数判断,需要自己实现一个函数。(我这里对应的函数是isContain())
int
isContain(
const
char
*a,
const
char
*b){
//查找b里是否有a
while
(*a!=
'
\
0
'
&& *b!=
'
\
0
'
){
if
(*a==*b) a++;
b++;
}
return
*a==
'
\
0
'
?
1
:
0
;
}
int
findLUSlength(
char
** strs,
int
strsSize){
int
i,j,len,contain;
for
(i=
0,
len
=0
;i
contain =
0
;
for
(j=
0
;j
if
(j!=i && isContain(strs[i],strs[j])){
contain =
1
;
break
;
}
}
if
(!contain && strlen(strs[i])>len) len = strlen(strs[i]);
}
return
len?len:-
1
;
}
来源:oschina
链接:https://my.oschina.net/u/4469818/blog/4273833