var checkInclusion = function(s1, s2) {
let hash=new Array(26).fill(0)
for(let i=0;i<s1.length;i++){
hash[s1.charCodeAt(i)-'a'.charCodeAt(0)]++
hash[s2.charCodeAt(i)-'a'.charCodeAt(0)]--
}
if(isAllZero(hash))return true
for(let k=s1.length;k<s2.length;k++){
hash[s2.charCodeAt(k)-'a'.charCodeAt(0)]--
hash[s2.charCodeAt(k-s1.length)-'a'.charCodeAt(0)]++
if(isAllZero(hash))return true
}
return false
};
const isAllZero=(hash)=>{
for(let i of hash){
if(i!==0){
return false
}
}
return true
}
var findAnagrams = function(s, p) {
let hash=new Array(26).fill(0)
let res=[]
for(let i=0;i<p.length;i++){
hash[p.charCodeAt(i)-'a'.charCodeAt(0)]++
hash[s.charCodeAt(i)-'a'.charCodeAt(0)]--
}
if(isAllZero(hash)){
res.push(0)
}
for(let k=p.length;k<s.length;k++){
hash[s.charCodeAt(k)-'a'.charCodeAt(0)]--
hash[s.charCodeAt(k-p.length)-'a'.charCodeAt(0)]++
if(isAllZero(hash)){
res.push(k-p.length+1)
}
}
return res
};
const isAllZero=(hash)=>{
for(let i of hash){
if(i!==0){
return false
}
}
return true
}
var lengthOfLongestSubstring = function(s) {
let maxLen=0
let set=new Set()
let l=0,r=0
while(r<s.length){
if(!set.has(s[r])){
set.add(s[r])
maxLen=Math.max(maxLen,r-l+1)
r++
}else{
set.delete(s[l])
l++
}
}
return maxLen
}
var minWindow = function(s, t) {
let tMap=new Map()
let window=new Map()
for(let i of t){
tMap.set(i,tMap.has(i)?tMap.get(i)+1:1)
}
let left=0,right=0
let res=Number.MAX_VALUE
let valid=0
let start=0
for(
if(tMap.has(s[right])){
window.set(s[right],window.has(s[right])?window.get(s[right])+1:1)
if(window.get(s[right])===tMap.get(s[right])){
valid++
}
}
while(valid===tMap.size){
if(right - left < res){
start = left
res = right - left
}
if(tMap.has(s[left])){
if(tMap.get(s[left]) === window.get(s[left])){
valid--
}
window.set(s[left],window.get(s[left]) - 1)
}
left++
}
}
return res === Number.MAX_VALUE ? "" : s.slice(start,start + res + 1)
}
var isPalindrome = function(s) {
s= s.replace(/[^A-Za-z0-9]/g, '').toLowerCase()
let str = s.split("").reverse().join("")
return str === s
}