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' 。因此, 重复 'a' 一次, 字符串可变为 "aa"。

示例 3:

输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。

示例 4:

输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 'c' 可以不被重复, 'a' 可以被重复一次。因此可以匹配字符串 "aab"。

示例 5:

输入:
s = "mississippi"
p = "mis*is*p*."
输出: false

解决方案

class Solution(object):
    def isMatch(self, s, p):
        dp = [[False] * (len(s) + 1) for _ in range(len(p) + 1)]
        dp[0][0] = True
        for i in range(1, len(p)):
            dp[i + 1][0] = dp[i - 1][0] and p[i] == "*"
        for i in range(len(p)):
            for j in range(len(s)):
                if p[i] == '*':
                    dp[i + 1][j + 1] = dp[i - 1][j + 1] or dp[i][j + 1]
                    if p[i - 1] == s[j] or p[i - 1] == '.':
                        dp[i + 1][j + 1] |= dp[i + 1][j]
                else:
                    dp[i + 1][j + 1] = dp[i][j] and (p[i] == s[j] or p[i] == '.')
        return dp[-1][-1]

def main(s, p):
    a = Solution()
    print(a.isMatch(s, p))

if __name__ == '__main__':
    s = "aab"
    p = "aa."
    main(s, p

原文地址:https://www.cnblogs.com/huang-yc/p/10356735.html

时间: 2024-10-31 23:18:29

LeetCode(10. 正则表达式匹配)的相关文章

10. 正则表达式匹配

/*给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串. 说明 : s 可能为空,且只包含从 a - z 的小写字母. p 可能为空,且只包含从 a - z 的小写字母,以及字符 .和 *. 示例 1 : 输入 : s = "aa" p = "a" 输出 : false 解释 : "a&

leetcode新年病房暴乱康复计划 10.正则表达式匹配 DP

/** * @param {string} s * @param {string} p * @return {boolean} */ var isMatch = function(s, p) { let dp = []; let len = s.length; let _len = p.length; for(let i = 0; i <= len; i++){ dp.push([]); dp[i][0] = 0; } dp[0][0] = 1; for(let i = 0; i <= _le

leetcode 10.正则表达式

题目描述特别简洁: 先贴代码: class Solution { public : bool isMatch(string s ,string p){ int dp[100][100] = {0}; s.insert(0,1,'@');p.insert(0,1,'@'); //为了将空字符考虑在内,初始化插入@方便之后的操作 int ls = s.size(),lp = p.size(); dp[0][0] = 1; //初始化dp(p与s为空字符) for(int j = 1 ; j < lp

LeetCode 10 Regular Expression Matching (正则表达式匹配)

翻译 实现支持"."和"*"的正则表达式匹配. "." 匹配支持单个字符 "*" 匹配零个或多个前面的元素 匹配应该覆盖到整个输入的字符串(而不是局部的). 该函数的原型应该是: bool isMatch(const char * s, const char * p) 示例: isMatch("aa","a") → false isMatch("aa","a

Leetcode 10 regular expression matching (正则表达式匹配) (动态规划)

Leetcode 10 问题描述 Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover the entir

[LeetCode] Regular Expression Matching 正则表达式匹配

Implement regular expression matching with support for '.' and '*'. '.' Matches any single character. '*' Matches zero or more of the preceding element. The matching should cover the entire input string (not partial). The function prototype should be

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

PHP正则提取或替换img标记属性 PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php /*PHP正则提取图片img标记中的任意属性*/ $str = '<center><img src="/uploads/images/20100516000.jpg"

【PYTHON】对整个文件进行正则表达式匹配

1 #coding:utf-8 2 import re 3 def IDXtoSCS(path):#IDX转换为开思的函数 4 IDXfile=open(path,'r') 5 fileread=IDXfile.readlines() 6 IDXfile.close() 7 p='"(\w)*",\s+(\d+\\.\d+),\s+(\d+\\.\d+),\s+(\d+\\.\d+),\s+"(\w*)",' 8 data=re.findall(p,fileread

Flex的正则表达式匹配速度与手工代码的比较

flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷自动机,这使得flex等词法分析器生成器生成的词法分析器匹配输入模式的效率非常高.当然,有人指责flex不够灵活,功能有限,很多问题都无法解决,比如Javascript.C++等语言中二义性的问题,实际上很多程序(比如Python的解释器)的词法分析器都是用的手工代码而不是flex自动生成的.这些都