!!!题解 | 正则表达式匹配 注意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];
    }
};

全部评论
点赞 回复 分享
发布于 04-29 22:37 河南

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务