1. 程式人生 > >52.正則表達式匹配

52.正則表達式匹配

lse amp 題目 subject 例如 ole char 但是 出現

題目描述

請實現一個函數用來匹配包括‘.‘和‘*‘的正則表達式。模式中的字符‘.‘表示任意一個字符,而‘*‘表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配

題目解答

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); } private 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]==‘*‘){
if((strIndex!=str.length && str[strIndex]==pattern[patternIndex]) || (strIndex!=str.length && pattern[patternIndex]==‘.‘)){ 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 && str[strIndex]==pattern[patternIndex]) || (strIndex!=str.length && pattern[patternIndex]==‘.‘)){ return matchCore(str,strIndex+1,pattern,patternIndex+1); } return false; } }
當pattern中的第二個字符不是“*”時: 1、如果str第一個字符和pattern中的第一個字符相匹配,那麽str和pattern都後移一個字符,然後匹配剩余的。 2、如果str第一個字符和pattern中的第一個字符相不匹配,直接返回false。
當pattern中的第二個字符是“*”時: 如果str第一個字符跟pattern第一個字符不匹配,則pattern後移2個字符,繼續匹配。如果str第一個字符跟pattern第一個字符匹配,可以有3種匹配方式: 1、pattern後移2字符,相當於x*被忽略; 2、str後移1字符,pattern後移2字符; 3、str後移1字符,pattern不變,即繼續匹配str下一位,因為*可以匹配多位;

52.正則表達式匹配