10. Regular Expression Matching
題目網址:https://leetcode.cn/problems/regular-expression-matching/
題意:給你一個 string
s
和一個 string patternp
,請實現一個支持'.'
和'*'
的正則表達式匹配。
'.'
匹配任意單個 char'*'
匹配 0 個 or 多個前面的那一個元素所謂匹配, 是要涵蓋整個
s
的, 而不是部分 string。
Solution:
想法:利用 DP, 其中
dp[i][j]
判斷s[0 ~ (i - 1)]
和p[0 ~ (j - 1)]
是否匹配,每次判斷當前s
、p
的最後一個 char 是否匹配
- 若
s[i - 1] == p[j - 1]
或p[j - 1] == '.'
: 代表當前s
、p
的最後一個 char 匹配, 則當前s
、p
是否匹配取決於前面的 substring, 也就是說dp[i][j] = dp[i - 1][j - 1]
- 若
p[j - 1] == '*'
: 代表要看p[j - 1]
的前一個 charp[j - 2]
若
s[i - 1] == p[j - 2]
或p[j - 2] == '.'
: 代表當前s
、p
最後一個 char 是匹配的, 則 `` 分别可重覆 0 次 or 重覆 1 次 or 重覆 2 次以上
重覆 0 次
:s[i - 1]
要和p[j - 3]
比較 ➔dp[i][j] = dp[i][j - 2]
重覆 1 次
:s[i - 2]
要和p[j - 3]
比較 ➔dp[i][j] = dp[i - 1][j - 2]
重覆 2 次以上
:s
去掉最後一個 char, 而p
不動➔dp[i][j] = dp[i - 1][j]
若
s[i - 1] != p[j - 2]
: 當前s
、p
最後一個 char 不匹配, 則 `` 重覆 0 次。s
不動,p
要往前取看是否匹配 ➔dp[i][j] = dp[i][j - 2]
除此之外, 還要考慮邊界條件
- 當
s
、p
皆為空時, 兩者匹配- 當
s
為空, 且p
不為空時, 兩者卻匹配的情況。e.g.s = ""
,p = "a*a*a*"
class Solution { |
- time:$O(m \cdot n)$ ➔ for loop
- space:$O(m \cdot n)$ ➔
dp
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論