*LeetCode 10 Regular Expression Matching 正则表达式

本文深入探讨了LeetCode中关于正则表达式匹配的题目,详细介绍了DFS、自动机等解决策略,并通过两种不同的代码实现方式展示了如何优雅地解决该问题,包括代码实现细节及时间复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

https://leetcode.com/problems/regular-expression-matching/


思路:

(1)DFS

(2)自动机


DFS版本写的比较烂,然后很长逻辑混乱,基本就是出bug补上。。。

592ms

const int DEBUG = 0;

class Solution {
public:
    bool match(char a, char b) {
        return (a == b || b == '.');
    }
    bool isMatch(string s, string p) {
       if(dfs(s, p, 0))
            return true;
        return false;
    }
    bool check(string p, int pos) {
        if( (p.size()-pos) %2 == 0 ){
            for(int i=1+pos; i<p.size(); i+=2)
                if(p[i] != '*')return false;
            return true;
        }
        return false;
    }

    bool dfs(string s, string p, int pos) {
        if(s.size() == 0) {
            /*if( (pos == p.size()&&p[pos-1]!='*' ||
                 (pos == p.size()-1 && p[pos]=='*'))
               )return true;*/
            if( (pos == p.size()&&p[pos-1]!='*' ||
                 (check(p, pos+1) && p[pos]=='*'))
               )return true;
            //if( (pos == p.size() || (check(p, pos) && p[pos]=='*')) )return true;
            if(check(p, pos))return true;
            if(DEBUG) {
                cout << "s.size() == 0 s=" << s << "  p=" << p << "  pos=" << pos << endl;
            }
            return false;
        }
        if(p.size() <= pos) {
            if(DEBUG) {
                cout << "p.size() <= pos s=" << s << "  p=" << p << "  pos=" << pos << endl;
            }
            return false;
        }
        int ptrs = 0, ptrp = pos;
        while(ptrs < s.size() && ptrp < p.size() ) {
            if( match(s[ptrs], p[ptrp]) ) {
                if(ptrp+2 < p.size() && p[ptrp+1] == '*') {
                    if(dfs(s.substr(ptrs), p, ptrp+2))return true;
                }
                ptrs ++, ptrp ++;
                continue;
            }
            if(p[ptrp] == '*') {
                if(ptrp >= 1) {
                    if( match(s[ptrs], p[ptrp-1]) ) {
                        return dfs(s.substr(ptrs+1), p, ptrp) | dfs(s.substr(ptrs), p, ptrp+1);
                        //   | 1 | 0
                    } else {
                        return dfs(s.substr(ptrs), p, ptrp+1);
                    }
                } else {
                    return false;
                }
                continue;
            } //else {
            if(ptrp+1 < p.size() && p[ptrp+1] == '*'){
                    //cout << "s=" << s.substr(ptrs) << "  p=" << p << "  " << ptrp+2 << endl;
                return dfs(s.substr(ptrs), p, ptrp+2);
            }
            else
                return false;
            //}
        }
        if( ptrs >= s.size()  ){
            pos = ptrp;
            //if( (pos == p.size()&&p[pos-1]!='*') || (pos == p.size()-1 && p[pos]=='*') )return true;
            //if( (pos == p.size() || (check(p, pos) && p[pos]=='*')) )return true;

            if( (pos == p.size()&&p[pos-1]!='*' ||
                 (check(p, pos+1) && p[pos]=='*'))
               )return true;
            if(check(p, pos))return true;
            return false;

        }
        //if(ptrp >= p.size())return false;
        return false;
    }
};


正则表达式写法:很优雅,但是时间692ms,应该是因为某些可以用循环,但是这里还是递归了


class Solution {
public:
    bool isMatch(string s, string p) {
        return matchHere(s, p);
    }
    bool matchHere(string s, string p) {
        if(s.size() == 0) {
            return p.size()==0 || p.size()%2==0&&p[1]=='*'&&matchStar('\0', s, p.substr(2));
        }
        if(p.size() >=2 && p[1]=='*' && matchStar(p[0], s, p.substr(2)))
            return true;
        if(s[0] == p[0] || p[0] == '.') {
            return matchHere(s.substr(1), p.substr(1));
        }
        return false;
    }
    //c* and p has erased c*
    bool matchStar(char c, string s, string p){
        int ptr = -1;
        do {
            ++ptr;
            if(matchHere(s.substr(ptr), p))return true;
        } while( ptr<s.size() && ( s[ptr]==c || c=='.' ) );
        return false;
    }
};


正则表达式的写法参考:

http://hexlee.iteye.com/blog/552361

里面有^和&的处理方法

有空再去练习下怎么DFS写得优雅,比如http://blog.youkuaiyun.com/doc_sgl/article/details/12719761

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值