Leetcode通配符匹配②

题目描述

请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。

在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

示例1
输入
“aaa”,“a*a”
返回值
true

思路

本题不同于以往的.代表一个字符 代表任意字符串(包含空)的问题。
本题
代表前面的字符可以统配0或者多次

采取dp[i][j]表示串的前面i个与模式串前面j个的匹配情况,容易知道dp[0][0]=true
需要单独计算dp[0][k]其依据说若出现* 那么dp[0][k]=dp[0][k-2]

对于一般的dp[i][j] 若str[i-1]==pattern[j-1] 或者 pattern[j-1] ==’.’ 那么dp[i][j]=dp[i-1][j-1]
而对于j>=2 并且pattern[j-1] == ‘*’ 的情况,如果 pattern[j-2]==str[i-1] || pattern[j-2] == ‘*’ 那么其代表前面字符可以统配1个或者0个 dp[i][j]=dp[i][j-2]||dp[i-1][j]
否则 dp[i][j]=dp[i][j-2] 只能通过匹配0个完成匹配

代码实现

 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));
        //dp[i][j]表示前面i个 与  前j个是否匹配
        dp[0][0]=true;
        for(int j=1;j<=len2;j++)
        {
            if(j>=2 && pattern[j-1]=='*')
                dp[0][j]=dp[0][j-2]; //只取决于前面的
        }
        for(int i=1;i<=len1;i++)
            for(int j=1;j<=len2;j++)
            {
                if(pattern[j-1]=='.' || str[i-1]==pattern[j-1])
                    dp[i][j]=dp[i-1][j-1];//匹配一个 取决于前面部分
                else 
                {
                   
                    if(j>=2 && pattern[j-1]=='*' )
                    {
                        //若模式串为 a*  对应位置为 a  那么可以匹配0个或者多个
                        if(pattern[j-2]=='.' || pattern[j-2]==str[i-1])
                            dp[i][j]=dp[i][j-2] || dp[i-1][j] ;
                        else
                            dp[i][j]=dp[i][j-2];//若末尾不相等  只能匹配0个寻求希望
                        //如  a* 对应位 b
                            
                    } 
                }
     
            }
        return dp[len1][len2]; 
    }
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页