滑动窗口
1.无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长 子串 的长度。
//滑动窗口定义left,right当arr有没有s[right]时right++;当arr有left ++;
var lengthOfLongestSubstring = function(s) {
let arr = [];
let left = 0;
let right = 0;
let maxLength = 0;
if(s.length === 0 || s.length == 1) return s.length;
while(right < s.length){
if(arr.indexOf(s[right]) === -1){
right++;
}else{
left++;
}
arr = s.slice(left,right);
maxLength = Math.max(maxLength,arr.length);
}
return maxLength ;
};
let str = "dvdf";
console.log(lengthOfLongestSubstring(str));
//考虑用哈希。当arrmap没有s[i]则加入key设置value = i-left;当有时,left++删除arrmap里的s[left],并设置值
var lengthOfLongestSubstring = function(s){
let arrMap = new Map();
let left = 0;
let maxLength = 0
for(let i=0;i<s.length;i++){
if(arrMap.has(s[i])){
left ++;
}
arrMap.set(s[i],i-left);
maxLength = Math.max(maxLength,arrMap.get(s[i]));
}
return maxLength;
}
2.找到字符串中所有字母异位词
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
//从s中截取p的长度字符串arr,把arr排序,符合条件就加入结果;left++,right++
var findAnagrams = function(s, p) {
let left = 0;
let right = p.length;
let res = [];
p = p.split('');
p.sort();
while(right<=s.length){
let temp = s.slice(left,right);
temp = temp.split('');
temp.sort();
if(temp.join('')==p.join('')){
res.push(left);
}
left++;
right++;
}
return res;
};
//呃。。。有点太耗时间了
//利用字符数量
var findAnagrams = function(s, p) {
let left = 0;
let right = p.length;
let res = [];
//统计p中各字母数量
let temp2 = new Map();
for(let k=0;k<p.length;k++){
if(temp2.has(p[k])){
temp2.set(p[k],temp2.get(p[k])+1);
}else{
temp2.set(p[k],1);
}
}
while(right<s.length){
let temp = s.slice(left,right);
let temp1 = new Map();
for(let i=0;i<temp.length;i++){
if(temp1.has(temp[i])){
temp1.set(temp[i],temp1.get(temp[i])+1);
}else{
temp1.set(temp[i],1);
}
}
let flag = true;
for(let [key,value] of temp1){
if(temp2.get(key)!==value){
flag = false;
break;
}
}
if(flag){
res.push(left);
}
left++;
right++;
}
return res;
};
2.1 方法
charCodeAt()
方法返回字符串中规定索引(下标)处字符的 Unicode。
charAt()
方法返回字符串中指定索引(下标)处的字符。
官方题解1
//记录26个字符的数量,窗口滑动时s第一个字符的数量-1,加上最后一个字符的数量+1
var findAnagrams = function(s, p) {
let sArray = new Array(26).fill(0);
let pArray = new Array(26).fill(0);
let arr = [];
if(p.length>s.length) return [];
//初始化数据
for(let i=0;i<p.length;i++){
pArray[p[i].charCodeAt()-'a'.charCodeAt()]++;
sArray[s[i].charCodeAt()-'a'.charCodeAt()]++;
}
if(pArray.join('')===sArray.join('')) arr.push(0);
for(let j=0;j<s.length-p.length;j++){
sArray[s[j].charCodeAt()-'a'.charCodeAt()]--;
sArray[s[j+p.length].charCodeAt()-'a'.charCodeAt()]++;
if(pArray.join('')===sArray.join('')) arr.push(j+1);
}
return arr;
};