Leetcode16不含有重复字符的最长子字符串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长连续子字符串 的长度。
答题:
/**
\* @param {string} s
\* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
let queue = []
let maxLen = 0
for(let i=0;i<s.length;i++){
if(queue.includes(s[i])){
queue.splice(0,1+queue.indexOf(s[i]))
queue.push(s[i])
}else{
queue.push(s[i])
maxLen = Math.max(maxLen,queue.length)
}
}
return maxLen
};
实际上是考察你一个滑动窗口的问题,queue中包含了一个不包含重复字符的数组,如果有新加进来的字符在数组中有重复,则剔除queue中的该字符以及之前的字符。没有的话就比较一下当前数组的长度和上一个len的大小,注意这里不能直接把len执行+1操作。
双指针解法
/**
- @param {string} s
- @param {string} p
- @return {number[]}
*/
var findAnagrams = function(s, p) {
const m = s.length,
n = p.length,
letterArr = [],
res = []; //收集起始索引的结果
if(n > m){
return res;
}
// 初始化26个英文字母的字符数,为0
for(let i = 0;i <= 26;i++){
letterArr.push(0);
}
// 收集p字符串的字符
for(let j = 0;j < n;j++){
letterArr[p[j].charCodeAt() - “a”.charCodeAt()]–;
}
// 定义开始指针
let left = 0;
for(let right = 0;right < m;right++){
const x = s[right].charCodeAt() - “a”.charCodeAt();
letterArr[x]++;
while(letterArr[x] > 0){
letterArr[s[left].charCodeAt() - “a”.charCodeAt()]–;
left++;
}
if(right - left + 1 === n){
//此时left就是满足条件的起始索引
res.push(left);
}
}
return res;
};