動態規劃
題解學習
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]=='.'
,字元成功接上,結果同13.
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
既然
a
和a*
已經匹配了 s後邊多乙個a變成aa
也可以。
dp[i+1][j+1]=dp[i+1][j]; 【這個*沒有作用 a*=a
既然上一位都已經成功了,如
aa
和aa*
,沒有必要畫蛇添足,直接變成1消失就好了。
dp[i+1][j+1]=dp[i+1][j-1]; 【這個*帶走了前面的字元 a*= null
如
ab
和abb*
,後面的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。從屁股...