!!!题解 | 正则表达式匹配 注意dp数组下标00的初始化问题
正则表达式匹配
https://www.nowcoder.com/practice/28970c15befb4ff3a264189087b99ad4
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @param pattern string字符串
* @return bool布尔型
*/
bool match(string str, string pattern) {
// write code here
int len1=str.size();
int len2=pattern.size();
vector<vector<bool>> dp(len1+1,vector<bool>(len2+1,false));
str.insert(str.begin(), ' ');
pattern.insert(pattern.begin(), ' ');//下标整体后移一位
/* for(int j=0;j<=len2;j++){
dp[0][j]=false;
}*/
/*
注意这里边界条件不对。dpdp[i][0]是让空模式串匹配字符串,应当全为false
dp[0][j]是让模式串去匹配空字符串 也是可能匹配成功的。例如a*b*c*
所以一是特例初始化,如下。
二是让循环从下标i=0开始
*/
dp[0][0]=true;
for(int j=1;j<=len2;j++){
if(pattern[j]=='*')dp[0][j]=dp[0][j-2];
else dp[0][j]=false;
}
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(pattern[j]!='*'){
if(str[i]==pattern[j]||pattern[j]=='.')dp[i][j]=dp[i-1][j-1];
else dp[i][j]=false;
}
else{
if(str[i]==pattern[j-1]||pattern[j-1]=='.'){
dp[i][j]=(dp[i-1][j]||dp[i][j-2]);//注意这里是i,不是i-1.
//这种情况只有匹配多次,就是前面那个,以及匹配0次,就是跳过a*,让i匹配j-2.(i-1,j-2)包含在匹配多次的情况中
}
else{
dp[i][j]=dp[i][j-2];
}
}
}
}
return dp[len1][len2];
}
};
查看16道真题和解析