Leetcode 10 正規表示式匹配

2021-10-05 18:18:40 字數 1212 閱讀 1548

動態規劃

題解學習

dp[i][j]表示s前i個字元能否被p的前j個字元所匹配。

對於s的第i個字元和p的第j個字元,有三種情況:

1.s[i]==p[j],表示這個字元接上了,dp取決於上乙個的結果,故dp[i+1][j+1]=dp[i][j]

2.p[j]=='.',字元成功接上,結果同1

3.p[j]=='*',* 的含義是 匹配零個或多個前面的那乙個元素,所以要考慮他前面的元素 p[j-1]。* 跟著他前乙個字元走,前乙個能匹配上 s[i],* 才能有用,前乙個都不能匹配上 s[i],* 也無能為力,只能讓前乙個字元消失,也就是匹配 0 次前乙個字元。

(1)當p[j-1]!=s[i]&&p[j-1]!='.',證明p的前乙個字元也對不上這個字元,所以只能寄希望於p的前兩個字元,然後取0去掉前乙個字元。

(2)此時 p的前乙個字元能對上這個字元或者p的前乙個字元是萬能的.

dp[i+1][j+1]=dp[i][j+1]; 【這個*前面就被肯定過作用, a*被拓展為多個a

既然aa*已經匹配了 s後邊多乙個a變成aa也可以。

dp[i+1][j+1]=dp[i+1][j]; 【這個*沒有作用 a*=a

既然上一位都已經成功了,如aaaa*,沒有必要畫蛇添足,直接變成1消失就好了。

dp[i+1][j+1]=dp[i+1][j-1]; 【這個*帶走了前面的字元 a*= null

ababb*,後面的b是多餘的。

class

solution

for(

int i=

0;ilength()

;i++)}

}return dp[s.

length()

][p.

length()

];}}

;

LeetCode10 正規表示式

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...

LeetCode 10 正規表示式匹配

實現支援 和 的正規表示式匹配。匹配任意單個字元。匹配零個或多個前面的元素。匹配應該覆蓋整個輸入字串 不是部分字串 函式 bool ismatch const char s,const char p 例子 ismatch aa a false ismatch aa aa true ismatch a...

leetCode 10 正規表示式匹配

這道題花了功夫,所以把想到的的寫下來。這個要從字串的屁股開始匹配。道理很簡單,從正面匹配,匹配的方式很多,需要全部列舉,不利於縮小問題規模,舉個例子,aac和a a a c,從正面開始匹配,從全部需要列舉的匹配情況中舉幾個例子 aac匹配a a a c,匹配a a a c,匹配a a a c。從屁股...