方法一:
剑指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]