題目:實現 正則表達式. * 的匹配
思路:
-
當模式中的第二個字符不是“*”時:
- 如果字符串第一個字符和模式中的第一個字符相匹配,那麼字符串和模式都後移一個字符,然後匹配剩餘的。
- 如果 字符串第一個字符和模式中的第一個字符相不匹配,直接返回false。
-
當模式中的第二個字符是“*”時:
- 如果字符串第一個字符跟模式第一個字符不匹配,則模式後移2個字符,繼續匹配。如果字符串第一個字符跟模式第一個字符匹配,可以有3種匹配方式:
- 模式後移2字符,相當於x*被忽略;
- 字符串後移1字符,模式後移2字符;
- 字符串後移1字符,模式不變,即繼續匹配字符下一位,因爲*可以匹配多位;
- 如果字符串第一個字符跟模式第一個字符不匹配,則模式後移2個字符,繼續匹配。如果字符串第一個字符跟模式第一個字符匹配,可以有3種匹配方式:
let match = (str,pattern)=>{
if(typeof str != 'string' || typeof pattern != 'string' ){return false;}
return matchFun(str,pattern,0,0);
function matchFun (str,pattern,i,j){
if(str.length == i && pattern.length == j){
return true;
}
if (j === pattern.length && i !== str.length) {
return false
}
if(pattern[j+1] && pattern[j+1] == '*'){
if(pattern[j] == str[i]||pattern[j] == '.'&&str.length != i){
return matchFun(str,pattern,i+1,j)||matchFun(str,pattern,i+1,j+2)||matchFun(str,pattern,i,j+2)
}
return matchFun(str,pattern,i,j+2);
}
if(pattern[j] == str[i] || pattern[j] =='.' && i != str.length){
return matchFun(str,pattern,i+1,j+1)
}
return false;
}
}