10. Regular Expression Matching

来源:互联网 发布:网络小贷与p2p的区别 编辑:程序博客网 时间:2024/06/12 04:00

1、题目描述

输入两个字符串s和p。判断p是否能与s匹配。

匹配规则:

‘.’ 匹配任意一个字符;‘*’匹配0个或更多个前面的元素。


2、思路

动态规划。

dp[i][j] 指的是s的前i位和p的前j位是否匹配。

初始化:

dp[i][j] 全都是false;

dp[0][0] = true;

dp[0][i]有可能是true;


状态转移:

1) if s[i]==p[j] || p[j]=='.', dp[i+1][j+1] = dp[i][j];

2) else if p[j] =='*'

    2.1) s[i] p[j-1]无法匹配,则‘*’表示0个字符,即消去, dp[i+1][j+1] = dp[i+1][j-1];

    2.2)s[i] p[j-1]匹配,则‘*’表示0个字符、多个字符只要满足一个就行

3)else dp[i+1][j+1] = false。


3、代码

    bool isMatch(string s, string p) {        int l1 = s.size(),l2=p.size();        bool dp[l1+1][l2+1];        for(int i=0;i<=l1;i++)            for(int j=0;j<=l2;j++)                dp[i][j]=false;        dp[0][0]=true;        for(int i=1;p[i]=='*'&&i<l2;i=i+2){            dp[0][i+1]=true;        }        for(int i=0;i<l1;i++)            for(int j=0;j<l2;j++){                if(s[i]==p[j]||p[j]=='.')                    dp[i+1][j+1]=dp[i][j];                else if(p[j]=='*'){                    if(s[i]!=p[j-1]&&p[j-1]!='.')                        dp[i+1][j+1]=dp[i+1][j-1];                    else                    dp[i+1][j+1]=dp[i+1][j-1]||dp[i][j+1];                }                else                   dp[i+1][j+1]=false;             }                return dp[l1][l2];    }