Leetcode 10. 正则表达式匹配(DAY 103) ---- Leetcode Hot 100(唯一真蝶回归)


原题题目


在这里插入图片描述


代码实现(首刷自解)


class Solution {
public:
    bool isMatch(string s, string p) {
        vector<bool> judge;
        string temp;
        for(const auto& chr:p) //前置初始化
        {
            if(chr != '*') 
            {
                judge.emplace_back(false);
                temp+=chr;
            }
            else    judge.back() = true;
        }

        int psize = judge.size(),ssize = s.size(),flag = 0;
        vector<vector<bool>> dp(psize+2,vector<bool>(ssize+2,false));
        dp[0][0] = true;

        for(int i=1;i<=psize;++i)
        {
            for(int j=1;j<=ssize;++j)
            {
                if(temp[i-1] == '.')
                {
                    if(!judge[i-1])
                    {
                        if(dp[i-1][j-1])    dp[i][j] = true;
                    }
                    else    if(dp[i-1][j-1] || dp[i][j-1])  dp[i][j] = dp[i][j-1] = true;
                }
                else
                {
                    if(!judge[i-1])
                    {
                        if(dp[i-1][j-1] && temp[i-1] == s[j-1]) dp[i][j] = true; 
                    }
                    else
                    {
                        if(dp[i-1][j-1] || dp[i][j-1])
                        {
                            dp[i][j-1] = true;
                            if(temp[i-1] == s[j-1]) dp[i][j] = true;
                        }
                    }
                }
            }
            if(dp[i-1][ssize] && judge[i-1])    dp[i][ssize] = true;      
        }
        return dp[psize][ssize];
    }
};

代码实现(二刷看解 有点困难 需要多做 对动态规划的转移方程 多理解 DAY 249 C++)


class Solution {
public:
    inline bool helper(const string& s,const string& p,const int& spos,const int& ppos)
    {
        if(!spos)   return false;
        if(p[ppos - 1] == '.')  return true;
 
        return p[ppos - 1] == s[spos - 1];
    }

    bool isMatch(string s, string p) {
        int psize = p.size(),ssize = s.size();

        vector<vector<int>> dp(ssize + 1,vector<int>(psize + 1,0));
        dp[0][0] = 1;

        for(int i = 0;i <= ssize;++i)
        {
            for(int j = 1;j <= psize;++j)
            {
                if(p[j - 1] == '*')
                {
                    dp[i][j] |= dp[i][j-2];
                    if(helper(s,p,i,j - 1))
                        dp[i][j] |= dp[i-1][j];
                }
                else
                {
                    if(helper(s,p,i,j))
                        dp[i][j] |= dp[i-1][j-1];
                }
                    
            }
        }
        
        return dp[ssize][psize];
    }
};

代码实现(三刷看解 DAY 310 C++)


class Solution {
 public:

  bool Helper(const string& s, const string& p, int spos, int ppos) {
    if (!spos) return false;
    
    if (p[ppos - 1] == '.') return true;
    return s[spos - 1] == p[ppos - 1];
  }

  bool isMatch(string s, string p) {
    vector<vector<bool>> dp(s.size() + 1, vector<bool>(p.size() + 1, false));
    dp[0][0] = true;

    for (int i = 0; i <= s.size(); ++i) {
      for (int j = 1; j <= p.size(); ++j) {
          if (p[j - 1] == '*') {
            dp[i][j] = dp[i][j - 2];
            if (!dp[i][j] && Helper(s, p, i, j - 1))
              dp[i][j] = dp[i - 1][j];
          } else {
            if (Helper(s, p, i, j))
              dp[i][j] = dp[i - 1][j - 1];
          }
        }
      }

    return dp[s.size()][p.size()];
  }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值