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
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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
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 31 32 33 34 35 36 37 38 39 | 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] |
标签:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2018-01-17 DNS 隐蔽通道工具资料汇总
2017-01-17 mongodb停止遇到shutdownServer failed: unauthorized: this command must run from localhost when running db without auth解决方法
2017-01-17 mongodb集群——配置服务器放分片meta信息,说明meta里包含了哪些数据信息