【劍指Offer刷題小記】正則表達(dá)式匹配(JAVA版)

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

問題分析:首先來看匹配完全的必要條件,就是模式串遍歷完,同時原字符串也遍歷完。據(jù)此,可以從前往后依次匹配直到匹配完全。由于’.’表示任意字符,因此可與任意字符匹配,可看作原串當(dāng)前遍歷到的字符。而’*‘的匹配結(jié)果則與‘*’前的字符有關(guān),所以對于模式串當(dāng)前字符下一位是不是‘*’,可分為兩種情況:

(1)當(dāng)前字符下一位不是‘*’:

? ? ? ? 這里又分為兩種情況:

? ? ? ? 1o 當(dāng)前字符匹配。那么原串和模式串都向后移一位,例如:

? ? ? 2o 當(dāng)前字符不匹配。那么直接返回false,例如:


(2)當(dāng)前字符下一位不是‘*’:

? ? 1o 當(dāng)前字符不匹配。那么為了盡可能進(jìn)行匹配,就要去除模式串的當(dāng)前字符,去判斷其后面的字符,也就是模式串向后移兩位,例如:

? ? 2o 當(dāng)前字符匹配:此時有多種情況

? ? ? ? ? ·1.‘*’表示前面的字符出現(xiàn)0次:那么原串不移動,模式串向后移兩位。如 aab/aa*ab? (加粗的為當(dāng)前字符)

? ? ? ? ? ·2.‘*’表示前面的字符出現(xiàn)1次:那么原串向后移一位,模式串向后移兩位。如aab/aa*b

? ? ? ? ? ·3.‘*’表示前面的字符出現(xiàn)n次(n>1):那么原串向后移一位,模式串不移動。如aaa/aa*

? ? 只要上面三種情況的任意一種匹配成功即可

代碼截圖

這里要注意條件判斷的先后順序,首先判斷索引是否超過長度,不然會導(dǎo)致越界的錯誤

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容