【剑指offer】正则表达式匹配

方法一:

剑指offer上的解法

# -*- coding:utf-8 -*-
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        # write code here
        if s == None or pattern == None:
            return False
        if pattern == '':
            return s == ''
        if len(pattern) == 1: 
            return len(s) == 1 and (s[0] == pattern[0] or pattern[0] == '.')
        if pattern[1] != '*':
            return s!= '' and (s[0] == pattern[0] or pattern[0] == '.') and self.match(s[1:],pattern[1:])
        
        # len(s) > 0,len(pattern) > 1 and pattern[1]== '*'的情况
        while s and (s[0] == pattern[0] or pattern[0] == '.'):
            # 用于跳出函数,当s循环到和*不匹配的时候,则开始去匹配p[2:]之后的规则
            if self.match(s,pattern[2:]):
                return True
            s = s[1:]
        # 当 s=='' 或首字母不匹配时
        return self.match(s,pattern[2:])

方法二:

动态规划【反向遍历】

  • * 初始化dp[len1][len2]=true,含义是:str=aaa 和pattern=aa* 从末尾开始匹配 "" 和 "" 一定为true
  • * 这个时候开始循环
  • * 1.外循环:因为我们要用aa*匹配aaa,以aaa为外循环,注意,从""开始匹配接下来a,aa,aaa
  • * for(int i = len1;i>=0;i--)   
  • * 2.内循环:拿aa*取匹配:匹配顺序 "*" "a*" "aa*",于是
  • * for(int j = len2 - 1;j>=0;j--)
  • * 循环体内部逻辑,参考递归调用

动态规划的实现思路:

 * 先看下一个是否是“*”,再看当前是否相等
     * 1.若下一个是"*",分为当前相等和当前不等 

     *      1.1:当前相等dp[i][j]=dp[i][j+2] || dp[i+1][j]
     *      1.2:当前不等dp[i][j]=dp[i][j+2]  

* 2.若不是"*",但是当前相等 d[i][j]= dp[i + 1][j + 1];

# -*- coding:utf-8 -*-
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        # write code here
        if not s and not pattern:
            return True
        n = len(s)
        m = len(pattern)
        dp = [[False]*(m+1) for i in range(n+1)]
        dp[-1][-1] = True
        for i in range(n,-1,-1): # 注意!这里从n开始,考虑s为空串的情况
            for j in range(m-1,-1,-1):
                if j < m-1 and pattern[j+1] == '*':
                    if i < n and (pattern[j] == s[i] or pattern[j] == '.'):
                        dp[i][j] = dp[i][j+2] or dp[i+1][j] # 不匹配当前字符OR匹配当前字符
                    else:
                        dp[i][j] = dp[i][j+2]
                else:
                    if i < n and (pattern[j] == s[i] or pattern[j] == '.'):
                        dp[i][j] = dp[i+1][j+1]
        return dp[0][0]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值