leetcode522(最长特殊序列II)--C语言实现

时间秒杀一切 提交于 2020-08-14 02:11:52

求:

给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。

子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。

输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -1 。

 

示例:

输入: "aba", "cdc", "eae"
输出: 3

 

提示:

  1. 所有给定的字符串长度不会超过 10 。
  2. 给定字符串列表的长度将在 [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<strsSize;i++){
        contain =  0 ;
         for (j= 0 ;j<strsSize;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 ;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!