剑指 Offer 19. 正则表达式匹配

剑指 Offer 19. 正则表达式匹配

地址:剑指 Offer 19. 正则表达式匹配

问题描述:

请实现一个函数用来匹配包含'. '和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。

示例 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 = "cab"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
示例 5:

输入:
s = "mississippi"
p = "misisp*."
输出: false
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母以及字符 . 和 ,无连续的 ''。
注意:本题与主站 10 题相同:https://leetcode-cn.com/problems/regular-expression-matching/

import util.control.Breaks._
object Solution {
    def isMatch(s: String, p: String): Boolean = {
        val sLen = s.length
        val pLen = p.length
        val newS = ' ' + s
        val newP = ' ' + p
        val dp = Array.fill(sLen+1, pLen+1)(false)
        //val dp = Array.ofDim[Boolean](sLen+1, pLen+1)
        dp(0)(0) = true

        for (i <- 0 to sLen) {
            for (j <- 1 to pLen){
                breakable{
                    if (j + 1 <= pLen && newP(j+1) == '*') {
                        break()
                    }

                    if (i > 0 && newP(j) != '*') {
                        dp(i)(j) = dp(i-1)(j-1) && (newS(i) == newP(j) || newP(j) == '.')
                    } else if (newP(j) == '*') {
                        //println("--------------------------------------------")
                        //println("i: " + i +" ,j: " + j)
                        //println("dp(i)(j-2): " + dp(i)(j-2))
                        if (i > 0) println("dp(i-1)(j): " + dp(i-1)(j) + " ,newS(i): " + newS(i) + " ,newP(j-1): " + newP(j-1))
                        //这里dp(i-1)(j) 是按照01背包情况处理
                        dp(i)(j) = (dp(i)(j-2)) || (i > 0 && dp(i-1)(j) && (newS(i) == newP(j-1) || newP(j-1) == '.'))
                        //println("dp(i)(j): " + dp(i)(j))
                    }
                }
            }
        }
        return dp(sLen)(pLen)
    }
}
func isMatch(s string, p string) bool {
    sLen := len(s)
    pLen := len(p)
    s = " " + s
    p = " " + p
    
    dp := make([][]bool, sLen+1)
    for i := 0; i < len(dp); i++ {
        dp[i] = make([]bool, pLen+1)
    }
    dp[0][0] = true

    for i := 0; i <= sLen; i++ {
        for j := 1; j <= pLen; j++ {
            if j + 1 <= pLen && p[j+1] == '*' {
                continue
            }

            if i > 0 && p[j] != '*' {
                dp[i][j] = dp[i-1][j-1] && (s[i] == p[j] || p[j] == '.')
            } else if p[j] == '*' {
                dp[i][j] = dp[i][j-2] || (i > 0 && dp[i-1][j] && (s[i] == p[j-1] || p[j-1] == '.'))
            }
        }
    }

    return dp[sLen][pLen]
}
posted @ 2020-12-19 21:18  ganshuoos  阅读(64)  评论(0编辑  收藏  举报