当前位置: 首页剑指offer刷题第七期问题详情 【动态规划专题】剑指 Offer 19. 正则表达式匹配 本问题对应课程链接:剑指offer刷题第七期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 6 个回答
解题思路
– a的含义是0个或者多个a
– 定义dp ,dp[i][j],其中i>=1,j>=1,表示长度为i的s子字符串和长度为j的p字符串的时候匹配,其中dp[0][0]=true表示空白字符串
– s[i-1]和pj-1
– 如果p[j-1]是.,dp[i][j]= dp[i-1][j-1]
– 如果p[j-1]是字符,dp[i][j]= dp[i-1][j-1] && s[i-1]p[j-1]
– 如果p[j-1]是
– pChars[j – 2] != sChars[i – 1] 时(注意同时要pChars[j – 2] != ‘.’ ),dp[i][j] = dp[i][j – 2];
– pChars[j – 2] sChars[i – 1] 时
– *不表示0个pChars[j – 2],dp[i][j] = dp[i][j – 2]
– *表示1个pChars[j – 2],dp[i][j] = dp[i][j – 1]
– *表示多个pChars[j – 2],dp[i][j] = dp[i – 1][j];
【题解1】
递归
dp
执行用时1ms击败100.00%(gpt的思路)
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length(), n = p.length();
// dp[i][j] 代表字符串 s 的前 i 个字符和 p 的前 j 个字符能否匹配。
boolean[][] dp = new boolean[m+1][n+1];
dp[0][0] = true;
for(int j = 2; j <= n; j += 2){
dp[0][j] = dp[0][j-2] && p.charAt(j – 1) ‘‘;
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(p.charAt(j-1) ‘‘){
// s: a p: a* 消除p s:abb p: ab* 消除s s:abb p: a.* 消除s
dp[i][j] = dp[i][j-2] || (dp[i-1][j] && s.charAt(i-1) p.charAt(j-2)) || (dp[i-1][j] && p.charAt(j-2) ‘.’);
}else{
dp[i][j] = (dp[i-1][j-1] && p.charAt(j-1) ‘.’) || (dp[i-1][j-1] && p.charAt(j-1) s.charAt(i-1));
}
}
时间:O(mn)
空间:O(mn)
时间复杂度O(Mn),空间复杂度O(Mn)。
//放弃
class Solution {
public boolean articleMatch(String s, String p) {
int m = s.length();
int n = p.length();
}