LeetCode重点题系列之【10. Regular Expression Matching】

本文介绍了一种使用动态规划解决正则表达式匹配问题的方法,重点讲解了如何处理包含 '.' 和 '*' 的模式,通过具体例子说明了算法的工作原理。

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 entire input string (not partial).

Note:

  • s could be empty and contains only lowercase letters a-z.
  • p could be empty and contains only lowercase letters a-z, and characters like . or *.

Example 1:

Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".

Example 2:

Input:
s = "aa"
p = "a*"
Output: true
Explanation: '*' means zero or more of the precedeng element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

Example 3:

Input:
s = "ab"
p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".

Example 4:

Input:
s = "aab"
p = "c*a*b"
Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore it matches "aab".

Example 5:

Input:
s = "mississippi"
p = "mis*is*p*."
Output: false

This a hard question. We can use dp to solve this problem.  

 

         Pattern

string

if pattern[i] equals to ".", or if pattern[i] equals string[i], then we remove this character, so mem[i][j]=mem[i-1][j-1], else if pattern[i] equals to "*", if pattern[i-1] equals to string[i], or if pattern[i-1] equals to ".", mem[i][j]=mem[i][j-2] or mem[i-1][j].

class Solution(object):
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        mem=[[False for _ in range(len(p)+1)] for _ in range(len(s)+1)]
        mem[0][0]=True
        for i in range(1,len(mem[0])):
            if p[i-1]=="*":
                mem[0][i]=mem[0][i-2]
        for r in range(1,len(mem)):
            for c in range(1,len(mem[0])):
                if p[c-1]=="." or p[c-1]==s[r-1]:
                    mem[r][c]=mem[r-1][c-1]
                elif p[c-1]=="*":
                    mem[r][c]=mem[r][c-2]
                    if p[c-2]==s[r-1] or p[c-2]==".":
                        mem[r][c]=mem[r][c] or mem[r-1][c]
        return mem[-1][-1]
        

 

LeetCode Problem 10, known as Regular Expression Matching, involves determining if a string matches a given pattern, considering special characters like `.` and `*`. The solution typically requires a recursive approach or dynamic programming to handle the complexities introduced by these special characters. Below is a Java implementation using recursion to solve this problem: ```java public class Solution { public boolean isMatch(String s, String p) { if (s == null || p == null) { return false; } int lenS = s.length(); int lenP = p.length(); if (lenP == 0) { return lenS == 0; } if (lenP == 1) { if (p.equals(s) || p.equals(".")) { return true; } else { return false; } } if (p.charAt(1) == '*') { while (s.length() > 0 && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.')) { if (isMatch(s, p.substring(2))) { return true; } s = s.substring(1); } return isMatch(s, p.substring(2)); } else { if (s.length() > 0 && (p.charAt(0) == s.charAt(0) || p.charAt(0) == '.')) { return isMatch(s.substring(1), p.substring(1)); } return false; } } } ``` This solution recursively checks for matches by evaluating the current characters and handling the `*` wildcard, which allows for zero or more of the preceding element. The function proceeds by either skipping the current pattern and the next (if the next character is `*`) or by matching the current character and proceeding in both strings. The implementation efficiently breaks down the problem into manageable recursive calls, ensuring all possible matches are explored, especially when dealing with the `*` operator, which introduces backtracking possibilities to find a valid match path[^2].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值