Leetcode 10. Regular Expression Matching

来源:互联网 发布:张鲁 三国杀淘宝 编辑:程序博客网 时间:2024/06/01 07:38
class Solution {public:    bool isMatch(string s, string p) {        if(p.empty())return s.empty();        bool T[p.size()+1][s.size()+1];        for(int i=0;i<=p.size();i++){            for(int j=0;j<=s.size();j++){                T[i][j]=false;            }        }        T[0][0]=true;                for(int i=0;i<=p.size();++i){            for(int j=0;j<=s.size();++j){                if(T[i][j]==false)continue;                else if(i+1<=p.size()&&j+1<=s.size()&&((s[s.size()-j-1]==p[p.size()-1-i])||p[p.size()-1-i]=='.')){                    T[i+1][j+1]=true;                }                else if(i+2<=p.size()&&p[p.size()-1-i]=='*'){                    T[i+2][j]=true;                    int k=1;                    while(j+k<=s.size()&&((s[s.size()-j-k]==p[p.size()-i-2])||(p[p.size()-i-2]=='.'))){                        T[i+2][j+k]=true;                        k++;                    }                }            }        }        return T[p.size()][s.size()];    }};


正则表达式匹配,首先做个分析,以s为abcdef,p为abc*为例。做出图所示,当我发现以p为二维数组的横坐标时,对于for循环嵌套的情况下,前一个状态的false并不能影响下一个状态,因此换做以s为横坐标,可以轻松发现,当前一个状态为false时,后一个状态肯定为false。。随后,对'*'这个符号进行判断,最初发现相当头疼,因为从字符串最左到最右考虑时,t[i][j]似乎要考虑到前面2个状态的情况,当时没想明白,觉得似乎不大好做(事后发现有合适的解法),因此在我的代码里,t[i][j]表示的是从字符串右边往左看,I个长度的p串和j个长度的s串的比较。这么看代码,逻辑就很清晰了


0 0
原创粉丝点击