S是不是L的有效子串(双指针)
题目描述
S长度 < 100, L长度 < 500000,判断S是不是L的有效子串。
判定规则:
- S中的每个字符都能在L中找到(可以不连续)
- 且S在L中的前后顺序与S中顺序保持一致
输出S串(aaa)最后一个有效字符(a)在L中的位置
暴力 O(n^2)
function vaildStr(s, l) {
if (!s) return true;
const hash = {};
const lLen = l.length, sLen = s.length;
let preIndex = 0;
for (let i = 0; i < sLen; i++) {
hash[s[i]] = i;
}
let start = 0;
while (start < lLen && l[start] !== s[0]) {
start++;
}
let end = start + 1;
while (end < lLen) {
if (preIndex + 1 === hash[l[end]]) {
preIndex = hash[l[end]];
}
end++;
}
if (preIndex === sLen - 1) {
return preIndex;
}
return -1;
}
双指针
function vaildStr(s, l) {
const sLen = s.length, lLen = l.length;
let i = 0, j = 0;
while (i < sLen && j < lLen) {
if (s[i] === l[j]) {
i++;
if (i === sLen) {
return j;
}
}
j++;
}
return -1;
}
console.log(vaildStr('aaa', 'baabaaa'))