題目:
請實現一個函數用來匹配包括'.'和'*'的正則表達式。模式中的字符'.'表示任意一個字符,而'*'表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配
知識點:
正則表達式:參考https://blog.csdn.net/qq_30034925/article/details/70216525
思路:
1、兩個都爲null時,不匹配
2、兩個數組下標
3、1)如果模式中第二個字符不是'*':
如果當前字符匹配或者當前模式字符是'.' :則繼續檢驗;否則返回false
2)如果模式中第二個字符是'*':
如果當前字符與模式中當前字符匹配:則字符向後移一位,模式中不變;(n個字符匹配)
如果當前字符與模式中當前字符匹配或模式中當前字符是'.':則字符向後移一位,模式中向後移兩位;(一個字符匹配)
如果模式中當前字符是'.'或沒有字符匹配:則字符向後移一位,模式中向後移兩位;(0個字符匹配)
答案:
public class Solution {
public boolean match(char[] str, char[] pattern)
{
if (str==null&&pattern==null){return false;}
int strIndex = 0;
int patternIndex = 0;
return matchCore(str,strIndex,pattern,patternIndex);
}
public boolean matchCore(char[] str,int strIndex,char[] pattern,int patternIndex){
//有效性檢驗:str到尾,pattern到尾,匹配成功
if(strIndex==str.length&&patternIndex==pattern.length){
return true;
}
//如果pattern先到尾,錯誤
if(strIndex!=str.length&&patternIndex==pattern.length){
return false;
}
//模式第2個是*,且字符串第1個跟模式第1個匹配,分3種匹配模式;如不匹配,模式後移2位
if(patternIndex+1<pattern.length && pattern[patternIndex+1]=='*'){
//首先str長度不爲0,兩個字符相等,pattern的字符爲.
if(strIndex != str.length && (pattern[patternIndex]==str[strIndex] || pattern[patternIndex]=='.')){
return matchCore(str,strIndex,pattern,patternIndex+2) || //pattern[patternIndex]=='.'時,匹配0個字符
matchCore(str,strIndex+1,pattern,patternIndex+2) ||//*代表一個字符
matchCore(str,strIndex+1,pattern,patternIndex);//*代表多個字符,繼續匹配下一個
}else{
return matchCore(str,strIndex,pattern,patternIndex+2);//匹配0個
}
}
//模式第2個不是*,且字符串第1個跟模式第1個匹配,則都後移1位,否則直接返回false
if(strIndex != str.length && (pattern[patternIndex]==str[strIndex] || pattern[patternIndex]=='.')){
return matchCore(str,strIndex+1,pattern,patternIndex+1);
}else{
return false;
}
}
}