当前位置: 首页剑指offer刷题第六期问题详情 【动态规划专题】剑指 Offer 19. 正则表达式匹配 本问题对应课程链接:剑指offer刷题第六期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 8 个回答
打卡
时间复杂度$O(mn)$,空间复杂度$O(mn)$
时间复杂度:O(nm)
空间复杂度:O(nm)
时间复杂度:O(nm)
空间复杂度:O(nm)
动态规划:dp[i][j]表示 s 的前 i 个字符串和 p 的前 j 个字符串是否匹配。
在匹配字符串的时候有几种情况需要考虑:
p[j] ‘‘: 可以匹配 p[j-1] 0次或多次
p[j] != ‘‘: 直接比较p[j]‘.’ || s[i]p[j]
在初始化 dp 的时候有几种情况需要考虑:
空字符串,空模式串:dp[0][0] = true
空字符串,非空模式串:dp[0][j]: 只有当 p[j]‘*’时,dp[0][j] = dp[0][j-2]; 其余情况 dp[0][j] = false;
非空字符串,空模式串:dp[i][0] = true;
非空字符串,非空模式串:计算dp[i][j]
最后返回 dp[s.size()][p.size()] 的结果即可
“`c++> dp(n+1, vector(m+1, false));
class Solution {
public:
bool articleMatch(string s, string p) {
int n = s.size(), m = p.size();
if (m == 0) {
return n == 0 ? true : false;
}
// dp[n][0] = false
vector
dp[0][0] = true;
// dp[0][m]: only c* can make dp[0][j] = true, other dp[0][j] = false
for (int j=1; j<=m; j++) { if (p[j-1] == '*') { if (j >= 2) dp[0][j] = dp[0][j-2];
else dp[0][j] = false;
} else {
dp[0][j] = false;
}
}
for (int i=1; i<=n; i++) { for (int j=1; j<=m; j++) { if (p[j-1] != '*') { if (p[j-1] == '.' || s[i-1] == p[j-1]) dp[i][j] = dp[i-1][j-1]; else dp[i][j] = false; } else { if (dp[i][j-2] == true) dp[i][j] = true; else if (s[i-1] == p[j-2] || p[j-2] == '.') dp[i][j] = dp[i-1][j]; else dp[i][j] = false; } } } return dp[n][m]; ```
//递归
class Solution {
public boolean articleMatch(String s, String p) {
return articleMatch(s,p,0,0);
}
private boolean articleMatch(String s,String p ,int ptr1,int ptr2){
//System.out.println(“ptr1=”+ptr1+” ptr2=”+ptr2);
if(s.length() ptr1 && p.length() ptr2) return true;//两指针同时到终点
else if(p.length() ptr2) return false;//p已遍历完s没遍历完
else if (s.length() ptr1)//s遍历完p没遍历完
{
if(ptr2 < p.length() && p.charAt(ptr2) ‘‘)//如果p的剩余部分为,则跳过该部分再判断
return articleMatch(s,p,ptr1,ptr2+1);
if(ptr2+1 < p.length() && p.charAt(ptr2+1) ‘‘)//如果p的剩余部分为a,则跳过该部分再判断
return articleMatch(s,p,ptr1,ptr2+2);
return false;
}
// if(s.charAt(ptr1) != p.charAt(ptr2) && p.charAt(ptr2)!=’.’ && p.charAt(ptr2)!=’‘)//或许可删
// return false;
if(s.charAt(ptr1) p.charAt(ptr2) || p.charAt(ptr2) ‘.’){
if(ptr2+1 < p.length() && p.charAt(ptr2+1)‘‘)//即使匹配上,若p的下一位为*,则有可能不消除
return articleMatch(s,p,ptr1+1,ptr2+1) || articleMatch(s,p,ptr1,ptr2+2);
return articleMatch(s,p,ptr1+1,ptr2+1);
}
}
//
class Solution {
public boolean articleMatch(String s, String p) {
boolean[][] dp = new boolean[s.length()+1][p.length()+1];
}
//动态规划