請實現一個函數用來匹配包括'.'和'*'的正則表達式。模式中的字符'.'表示任意一個字符,而'*'表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配
當模式中的第二個字符不是“*”時:
1、如果字符串第一個字符和模式中的第一個字符相匹配,那麼字符串和模式都後移一個字符,然後匹配剩餘的。
2、如果 字符串第一個字符和模式中的第一個字符相不匹配,直接返回false。
而當模式中的第二個字符是“*”時:
如果字符串第一個字符跟模式第一個字符不匹配,則模式後移2個字符,繼續匹配。如果字符串第一個字符跟模式第一個字符匹配,可以有3種匹配方式:
1、模式後移2字符,相當於x*被忽略;
2、字符串後移1字符,模式後移2字符;
3、字符串後移1字符,模式不變,即繼續匹配字符下一位,因爲*可以匹配多位;
這裏需要注意的是:Java裏,要時刻檢驗數組是否越界。
package Tree;
public class patchStrings {
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;
}
//模式第二個爲"*",且字符串第1個匹配,分三種匹配模式;如果不匹配,模式後移2
if(patternIndex+1 < pattern.length && pattern[patternIndex + 1] == '*'){
if((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex !=str.length)){
//1,模式後移2,視爲x*匹配0個字符
//2,視爲模式匹配1個字符
//3,*匹配1個,再匹配str中的下一個
return matchCore(str, strIndex, pattern, patternIndex+2)
|| matchCore(str, strIndex+1, pattern, patternIndex +2)
||matchCore(str, strIndex+1, pattern, patternIndex);
}else{
return matchCore(str, strIndex, pattern, patternIndex+2);
}
}
//模式第2個不是*,且字符串第1個跟模式第1個匹配,則都後移1位,否則直接返回false
if((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex != str.length)){
return matchCore(str, strIndex+1, pattern, patternIndex+1);
}
return false;
}
public static void main(String[] args) {
patchStrings ps = new patchStrings();
String str="aaa";
String pattern = "ab*ab*ac*a";
char[] str1 = str.toCharArray();
char[] str2 = pattern.toCharArray();
System.out.println(ps.match(str1, str2));
}
}
參考地址:https://www.nowcoder.com/profile/7312159/codeBookDetail?submissionId=16351982