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