LeetCode刷題系列10

給你一個字符串 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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/regular-expression-matching
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
  • C++編程實現:
class Solution {
    public:
    bool isMatch(string s, string p) {
        int ssize = s.size(),psize = p.size();
        bool dp[ssize + 1][psize + 1];
        dp[ssize][psize] = true;
        for(int i = 0; i < ssize;++i)
            dp[i][psize] =false;
        for(int i = ssize;i >= 0;--i)
        {
            for(int j = psize - 1; j >= 0;--j)
            {
                bool firstMatch = (i < ssize && ( s[i] == p[j] || p[j] == '.')); 
                if(j + 1 < psize && p[j + 1] == '*')
                {
                    dp[i][j] = dp[i][j + 2] || firstMatch && dp[i + 1][j];
                }
                else
                {
                    dp[i][j] = firstMatch && dp[i + 1][j + 1];
                }
            }
        }
        return dp[0][0];
    }
}; 
————————————————
版權聲明:本文爲CSDN博主「softwareX4」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/softwareX4/article/details/90761502
  • Python編程實現
def isMatch(text, pattern) -> bool:
    memo = dict() # 備忘錄
    def dp(i, j):
        if (i, j) in memo: return memo[(i,j)]
        if j == len(pattern): return i == len(text)

        first = i < len(text) and pattern[j] in {text[i], '.'}

        if j <= len(pattern) - 2 and pattern[j + 1] == '*':
            ans = dp(i, j+2) or first and dp(i+1, j)
        else:
            ans = first and dp(i+1, j+1)
        
        memo[(i,j)] = ans
        return ans
    
    return dp(0,0)

 

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