leetcode刷题记录-522. 最长特殊序列 II

102 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

前言

今天的题目为中等,题目的难点在于如何去判断两个字符串之间是否是互为子序列,能够弄清楚这点就会变得特别简单。

每日一题

今天的题目是 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] 只包含小写英文字母

题解

暴力模拟

题目的重点在于,怎么去判断两个字符串是否是对方的子序列,那么我们可以先设计一个算法用来判断两个字符串之间的关系,子序列的定义是子序列可以通过字符串删去部分字符后会相等。

那么我们可以通过一个函数,输入两个字符串,如何判断两个数其中一个数是否是另一个的子序列,我们可以通过删去部分字符还是能够相等这个概念,从0下标开始,两个字符串的当前下标的字符要是相等的话,就可以一起跳过,要是不相等,就由父字符串向前进位,一直这样循环,要是到最后子字符串能够进位到最后一位,那就说明子字符串都被父字符串所包含,那么就是父字符串的子序列。

function isSub(s1: string, s2: string) {
    let index1 = 0, index2 = 0;
    while (index1 < s1.length && index2 < s2.length) {
        if (s1[index1] === s2[index2]) {
            index1++;
        }
        index2++;
    }
    return index1 === s1.length;
}

通过上述函数的返回值能够知道两个字符串之间的父子关系,但是要注意上面的函数是属于单项判断,所以循环的时候,两个字符串的相反情况也需要判断,剩下的就是通过双重循环遍历每一个数组元素,当然碰到相同的两个就可以进行跳过。

function findLUSlength(strs: string[]): number {
    let res = -1;
    for (let i = 0; i < strs.length; i++) {
        const str1 = strs[i];
        let flag = false;
        for (let j = 0; j < strs.length; j++) {
            if (i === j) continue;
            const str2 = strs[j];
            if (isSub(str1, str2)) {
                flag = true;
                break;
            }
        }
        if (!flag) {
            res = Math.max(res, str1.length);
        }
    }
    return res;
};

image.png