DFS和动态规划——字符串匹配 真蛋疼 为*的情况需考虑匹配0个、1个、2个情况 DFS会超时 正则匹配的话 需要向前看x*的情况 打包处理
192. 通配符匹配
中文
English
判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:
- '?' 可以匹配任何单个字符。
- '*' 可以匹配任意字符串(包括空字符串)。
两个串完全匹配才算匹配成功。
样例
样例1
输入:
"aa"
"a"
输出: false
输出2
输入:
"aa"
"aa"
输出: true
输出3
输入:
"aaa"
"aa"
输出: false
输出4
输入:
"aa"
"*"
输出: true
说明: '*' 可以替换任何字符串
输出5
输入:
"aa"
"a*"
输出: true
样例6
输入:
"ab"
"?*"
输出: true
说明: '?' -> 'a' '*' -> 'b'
样例7
class Solution:
"""
@param s: A string
@param p: A string includes "?" and "*"
@return: is Match?
"""
def isMatch(self, s, p):
# write your code here
m,n = len(s),len(p)
dp = [[False]*(n+1) for i in range(m+1)]
dp[0][0] = True
for i in range(1, m+1):
dp[i][0] = False
for j in range(1, n+1):
dp[0][j] = dp[0][j-1] and p[j-1] == '*'
for i in range(1, m+1):
for j in range(1, n+1):
if p[j-1] == '*':
dp[i][j] = dp[i-1][j-1] or dp[i][j-1] or dp[i-1][j]
else:
dp[i][j] = dp[i-1][j-1] and (p[j-1] == '?' or p[j-1] == s[i-1])
return dp[m][n]
"""
def dfs(s, i, p, j):
if i == len(s) and j == len(p):
return True
if i == len(s) and p[j:] == "*":
return True
if i == len(s) or j == len(p):
return False
if p[j] == '?':
return dfs(s, i+1, p, j+1)
elif p[j] == '*':
return dfs(s, i, p, j+1) or dfs(s, i+1, p, j+1) or dfs(s, i+1, p, j)
else:
if s[i] != p[j]:
return False
return dfs(s, i+1, p, j+1)
return dfs(s, 0, p, 0)
"""
154. 正则表达式匹配
中文
English
实现支持'.'和'*'的正则表达式匹配。
'.'匹配任意一个字母。
'*'匹配零个或者多个前面的元素。
匹配应该覆盖整个输入字符串,而不仅仅是一部分。
需要实现的函数是:bool isMatch(string s, string p)
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true
样例
样例 1:
输入:"aa","a"
输出:false
解释:
无法匹配
样例 2:
输入:"aa","a*" 输出:true 解释: '*' 可以重复 a
class Solution:
"""
@param s: A string
@param p: A string includes "." and "*"
@return: A boolean
"""
def isMatch(self, s, p):
# write your code here
m, n = len(s), len(p)
dp = [[False] * (n + 1) for i in range(m + 1)]
dp[0][0] = True
for i in range(1, m + 1):
dp[i][0] = False
for j in range(1, n + 1):
if p[j - 1] == '*':
dp[0][j] = dp[0][j - 1]
continue
if j < n and p[j - 1] != '*' and p[j] == '*':
dp[0][j] = dp[0][j - 1]
for i in range(1, m + 1):
for j in range(1, n + 1):
if p[j - 1] == '*':
dp[i][j] = dp[i][j - 1]
continue
if j < n and p[j] == '*':
if p[j-1] != '.' and p[j - 1] != s[i - 1]:
dp[i][j] = dp[i][j - 1]
else:
dp[i][j] = dp[i][j - 1] or dp[i - 1][j - 1] or dp[i - 1][j]
else:
dp[i][j] = dp[i - 1][j - 1] and (p[j - 1] == '.' or p[j - 1] == s[i - 1])
return dp[m][n]

浙公网安备 33010602011771号