持续创作,加速成长!这是我参与「掘金日新计划 · 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;
};