leetcode 正則表達式 (動態規劃)

給你一個字符串 s 和一個字符規律 p,請你來實現一個支持 '.' 和 '*' 的正則表達式匹配。

'.' 匹配任意單個字符
'*' 匹配零個或多個前面的那一個元素
所謂匹配,是要涵蓋 整個 字符串 s的,而不是部分字符串。

說明:

s 可能爲空,且只包含從 a-z 的小寫字母。
p 可能爲空,且只包含從 a-z 的小寫字母,以及字符 . 和 *。
示例 1:

輸入:
s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字符串。
示例 2:

輸入:
s = "aa"
p = "a*"
輸出: true
解釋: 因爲 '*' 代表可以匹配零個或多個前面的那一個元素, 在這裏前面的元素就是 'a'。因此,字符串 "aa" 可被視爲 'a' 重複了一次。
示例 3:

輸入:
s = "ab"
p = ".*"
輸出: true
解釋: ".*" 表示可匹配零個或多個('*')任意字符('.')。
示例 4:

輸入:
s = "aab"
p = "c*a*b"
輸出: true
解釋: 因爲 '*' 表示零個或多個,這裏 'c' 爲 0 個, 'a' 被重複一次。因此可以匹配字符串 "aab"。
示例 5:

輸入:
s = "mississippi"
p = "mis*is*p*."
輸出: false

題解:

dp[i][j]表示s的前i個字符可以被p的前j個字符匹配。

對於s[i]和p[j],如果s[i]===p[j] || p[j]=='.'的話,dp[i][j]=dp[i-1][j-1];

如果p[j]=='*' ,

那麼如果s[i]!=p[j-1] && p[j-1]!='.' 那麼,dp[i][j]=dp[i][j-2];  

否則,dp[i][j] = dp[i-1][j]     // 匹配多個

       || dp[i][j-1]  //匹配一個

       || dp[i][j-2];   // 一個也不匹配

參考代碼:

 1 class Solution {
 2 public:
 3     bool isMatch(string s, string p) {
 4         s=" "+s;p=" "+p;
 5         int n=s.length(),m=p.length();
 6         bool dp[n+1][m+1];
 7         memset(dp,false,(n+1)*(m+1));
 8         dp[0][0]=true;
 9 
10         for(int i=1;i<=n;++i)
11             for(int j=1;j<=m;++j)
12             {
13                 if(s[i-1]==p[j-1] || p[j-1]=='.')
14                     dp[i][j]=dp[i-1][j-1];
15                 else if(p[j-1]=='*')
16                 {
17                     if(s[i-1]!=p[j-2]&&p[j-2]!='.')
18                         dp[i][j]=dp[i][j-2];
19                     else dp[i][j]=dp[i-1][j]||dp[i][j-1]||dp[i][j-2];
20                 }
21             }
22 
23         return dp[n][m];
24     }
25 };
C++

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章