[剑指offer]JT52---正则表达式(我真的震惊,竟然要用动态规划!)

我们先来看看题目怎么说

在这里插入图片描述

思路与代码

思路就是动态规划。
这个详解还要过几天再更,这题还挺难的,其实
先上代码和注释

class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    bool match(string str, string pattern) {
    
    
        // write code here
        int m=str.size(),n=pattern.size();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        for(int i=0;i<=m;i++){
    
    
            for(int j=0;j<=n;j++){
    
    
                if(j==0){
    
    //判断是不是空正则
                    dp[i][j]=i==0;//两个都为空dp[0][0]为1,空枕着非空字符串为0
                }
                //非空,然后判断正则最后一个字符是不是*
                else{
    
    
                    if(pattern[j-1]!='*'){
    
    //[j-1]对应着有j-1个正则字符
                        if(i>0&&(str[i-1]==pattern[j-1]||pattern[j-1]=='.'))
                            dp[i][j]=dp[i-1][j-1];
                    }else{
    
    //如果为*分为看或者不看*的作用
                        if(j>=2)//不看
                            dp[i][j]|=dp[i][j-2];
                        if(i>=1&&j>=2&&(str[i-1]==pattern[j-2]||pattern[j-2]=='.'))//看 需要满足一定条件
                            dp[i][j]|=dp[i-1][j];
                    }
                }
            }
        }
        return dp[m][n];
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42136832/article/details/115261966