[leetcode]_522. 最长特殊序列 II

522. 最长特殊序列 II

题目

给定字符串列表 strs ,返回其中 最长的特殊序列 。如果最长特殊序列不存在,返回 -1 。

特殊序列 定义如下:该序列为某字符串 独有的子序列(即不能是其他字符串的子序列)。

 s 的 子序列可以通过删去字符串 s 中的某些字符实现。

例如,"abc" 是 "aebdc" 的子序列,因为您可以删除"aebdc"中的下划线字符来得到 "abc" 。"aebdc"的子序列还包括"aebdc"、 "aeb" 和 "" (空字符串)。

示例1

输入: strs = ["aba","cdc","eae"]
输出: 3

示例2

输入: strs = ["aaa","aaa","aa"]
输出: -1

提示

  • 2 <= strs.length <= 50
  • 1 <= strs[i].length <= 10
  • strs[i] 只包含小写英文字母

题解

思路

要求找出最长的特殊序列,特殊序列定义为:独有的子序列;在看提示,数据量为 50 * 10; O ( n 2 ) O(n^2) 复杂度可以接受;果断for循环;

重点在快速判断两个字符串中某个字符串是否是另一个字符串的子序列;这个比较简单,双指针可以解决;

for循环后通过 check 方法判断某个字符串是否是另一个字符串的子序列,并用map标记当前字符串,表示字符串并非特殊序列;

最后枚举原字符串列表,找出最长的特殊序列即可

代码如下:

代码

var findLUSlength = function(strs) {
    const len =strs.length;
    let map = {}
    if(len === 1) return strs[0];
    for(let i = 0 ; i < len ; i++){
        for(let j = 0 ; j < len ; j++){
            if (i === j) continue;
            if(check(i,j)){
                map[strs[i]] = ( map[strs[i]] || 0) + 1;
              
            }
           
        }
    }
    let max = -1;
    for(let i = 0 ; i < len ; i++){
        if(!map[strs[i]]){
           max =  Math.max(max,strs[i].length)
        }
    }
    return max

    function check(i,j){
        let x = 0;
        let y = 0;
        while(x < strs[i].length && y < strs[j].length){
            if(strs[i][x] === strs[j][y]){
                x++;
            }
            y++;

        }
        return x === (strs[i].length)
    }

    
};

结语

作者水平有限,如有不足欢迎指正;任何意见和建议欢迎评论区浏览讨论

猜你喜欢

转载自juejin.im/post/7113731991299686408
今日推荐