剑指OFFER 正则表达式匹配

剑指OFFER 正则表达式匹配

写这道题花了很长的时间,提交了无数次,果然是HARD的难度.搜了别人的博客,有两种解法,一种是递归,一种是动态规划.目前我只实现了递归,代码也有点乱,蛮多边界条件需要考虑的.

递归题解

class Solution {
public:
    string s;
    string p;
    int s_size;
    int p_size;

    bool ok = false; 

    void recur(int sp,int pp)
    {
        if(sp >= s_size)
        {
            if(pp < p_size && p[pp+1]=='*'){
                recur(sp,pp+2);
                return;
            }
            if(pp >= p_size){
                ok = true;
                return;
            }
            return;
        }
        
        if(pp >= p_size){
            return;
        }

        if(pp+1<p_size && p[pp+1] == '*'){
            
            if(p[pp]=='.' || s[sp]==p[pp])
            recur(sp+1,pp);  // * 令该字符出现1次,多次递归就相当于出现多次了
            
            recur(sp,pp+2);// * 令该字符为出现次数为0
        }


        if(p[pp]=='.' || s[sp]==p[pp]){
            recur(sp+1,pp+1);
        }
    }

    bool isMatch(string s_str, string p_str) {
        s_size = s_str.size();
        p_size = p_str.size();
        
        if(s_size == 0 && p_size == 0)return true;
        if(s_size != 0 && p_size == 0)return false;
        
        ok = false;
        s = s_str;
        p = p_str;

        recur(0,0);
        return ok;
    }
};

注:这是在leetcode上提交的代码,稍加修改即可通过剑指OFFER的OJ

posted @ 2020-02-01 09:24  virgil_devil  阅读(209)  评论(0编辑  收藏  举报