剑指offer 2.27

63 阅读1分钟

面试题19. 正则表达式匹配

// 不借用Hash,这样存在重复计算
var isMatch = function(s, p) {
    let dp = (s,i,p,j)=>{
        if(j==p.length){// 若p遍历结束,则s必须同时遍历结束
            return i==s.length;
        }
        if(i==s.length){// 若s遍历结束,则p余下的部分必须被抵消为空才可以
            if((p.length-j)%2==1){// 若余字符数为奇数,则必不可能抵消
                return false;
            }
            for(;j<p.length-1;j+=2){// 若为偶数,必须是一个字符一个'*'的搭配
                if(p[j+1]!='*'){
                    return false;
                }
            }
            return true;
        }
        if(s[i]==p[j]||p[j]=='.'){
            if(j+1<p.length&&p[j+1]=='*'){
                return dp(s,i+1,p,j)||dp(s,i,p,j+2);
            }
            else return dp(s,i+1,p,j+1);
        }
        else if(j+1<p.length&&p[j+1]=='*'){
            return dp(s,i,p,j+2);
        }
        else{
            return false;
        }
    }
    return dp(s,0,p,0);
};
借用hash,速度更快
var isMatch = function(s, p) {
    let map = new Map();
    let dp = (s,i,p,j)=>{
        if(j==p.length){// 若p遍历结束,则s必须同时遍历结束
            return i==s.length;
        }
        if(i==s.length){// 若s遍历结束,则p余下的部分必须被抵消为空才可以
            if((p.length-j)%2==1){// 若余字符数为奇数,则必不可能抵消
                return false;
            }
            for(;j<p.length-1;j+=2){// 若为偶数,必须是一个字符一个'*'的搭配
                if(p[j+1]!='*'){
                    return false;
                }
            }
            return true;
        }
        const key = i.toString()+','+j.toString();
        if(map.has(key)) return map.get(key);
        let res = false;
        if(s[i]==p[j]||p[j]=='.'){
            if(j+1<p.length&&p[j+1]=='*'){
                res = dp(s,i+1,p,j)||dp(s,i,p,j+2);
            }
            else res = dp(s,i+1,p,j+1);
        }
        else if(j+1<p.length&&p[j+1]=='*'){
            res = dp(s,i,p,j+2);
        }
        else{
            res = false;// 直接return false也可以
        }
        map.set(key,res);
        return res;
    }
    return dp(s,0,p,0);
};

剑指 Offer 14- II. 剪绳子 II

// 注意取模就行
var cuttingRope = function(n) {
    if(n==1||n==2) return 1;
    if(n==3) return 2;
    let res = 1;
    while(n){
        if(n==4){
            n -= 4;
            res = res*4%1000000007;
        }
        else if(n==2){
            n -= 2;
            res = res*2%1000000007;
        }
        else{
            n -= 3;
            res = res*3%1000000007;
        }
    }
    return res%1000000007;
};