• 剑指 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]
    }
    
  • 相关阅读:
    html表格,table标签
    2-3VRP的基本配置
    6 sys模块
    3 datetime模块
    2 time模块
    1 模块和包的介绍
    12 函数进阶---生成器
    13 函数进阶---迭代器
    10 函数进阶---闭包
    11 函数进阶---装饰器
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/14161180.html
Copyright © 2020-2023  润新知