leetcode Day38 剑指专项14-18

175 阅读1分钟

剑指 Offer II 014. 字符串中的变位词

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++){
    //比较s2每一个s1长度的字串
        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
}

剑指 Offer II 015. 字符串中的所有变位词

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
}

剑指 Offer II 016. 不含重复字符的最长子字符串

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
};

剑指 Offer II 017. 含有所有字符的最短字符串

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(;right<s.length;right++){
        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);
};

剑指 Offer II 018. 有效的回文

var isPalindrome = function(s) {
    s= s.replace(/[^A-Za-z0-9]/g, '').toLowerCase() 
    let str = s.split("").reverse().join("")
    return str === s
};