给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。
子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。
输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -1 。
示例:
输入: “aba”, “cdc”, “eae”
输出: 3
思路:
这道题,要注意判断的是否是子序列。只要字符串不是比它长和等的子序列,就是一个特殊序列。因此这里就依次将字符串与其它字符串进行判断,是否是子序列,然后输出最长的长度。
int findLUSlength(vector<string>& strs)
{
int res = -1;
for(int i = 0; i < strs.size(); ++i)
{
int flag = 0;
for(int j = 0; j < strs.size(); ++j)
{
if(i != j && strs[i].size() <= strs[j].size())
{
if(isSubsequence(strs[i], strs[j]))
{
flag = 1;
break;
}
}
}
if(flag == 0)
{
int temp = strs[i].size();
if(res < temp)
{
res = temp;
}
}
}
return res;
}
int isSubsequence(string s1, string s2)
{
//如果在s2中按顺序找到s1子序列, 则返回0;
int i = 0;
int j = 0;
while(i < s1.size() && j < s2.size())
{
if(s1[i] == s2[j])
{
i++;
j++;
}
else
{
j++;
}
}
//有个字符串遍历完了,判断是否是s1,则说明是
if(i == s1.size())
{
return 1;
}
return 0;
}