面试题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;
};