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!
評論
