題目描述:請實現(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)致越界的錯誤