【LeetCode】【C++】Wildcard Matching

来源:互联网 发布:网络安全教育新闻稿 编辑:程序博客网 时间:2024/06/08 09:48

题目

‘?’ Matches any single character.
‘*’ Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch(“aa”,”a”) → false
isMatch(“aa”,”aa”) → true
isMatch(“aaa”,”aa”) → false
isMatch(“aa”, “*”) → true
isMatch(“aa”, “a*”) → true
isMatch(“ab”, “?*”) → true
isMatch(“aab”, “c*a*b”) → false

思路

此题和第十题 Regular Expression Matching极为相像,只不过这个题‘*’可代表任意字符串,而10题只能表示若干个前面字母。举例来说,此题中*可以表示a,ab,abdfefa等,也可以表示空。但10题中*不可以单独出现,其必须和它前面的字母共同构成一个表达式,比如说a*表示若干个a,也即a,aa,aaa,或空。
仍然采用DP,设置一个vectorre(n+1),存放第一个字符串截止到该位置的匹配情况,然后从第二个字符串开始遍历,遇到*要特殊处理,对于字符串2的每一位,都要从字符串1中去寻找是否可以匹配上的位置,并把相应位置标记为真。每一个位置的状态均由前一位置决定,也就是说前一位置不匹配,这一位置一定不能匹配。遍历结束后输出最后一个位置的匹配结果。

代码

class Solution {public:    bool isMatch(const char *s, const char *p) {        int m = strlen(s);        int n = strlen(p);        if (n==0) return m==0;        if (m>30000) return false;          //没有这句话有一个case:aaaaaa居多a的过不去。。。        vector<bool> re(m+1,false);        re[0]=true;                         //默认第零位为匹配,因为有可能p[0]==*        for (int i=0;i<n;i++){            if (p[i]=='*'){                 //判断是否为*,*需要特殊处理                for (int k=0;k<m;k++){                    re[k+1]=re[k+1]||re[k]; //如果已经为真,则继续为真;否则要取决于前一位。                }            }            else{                for (int j=m;j>0;j--){      //取决于前一位,并且要求这一位匹配                    re[j]=re[j-1]&&(p[i]==s[j-1]||p[i]=='?');                }            }            re[0] = re[0]&&p[i]=='*';       //如果该位置不为*,则第零位不可为真        }        return re[m];    }};

转载请注明出处:http://blog.csdn.net/monkeyduck
欢迎留言,关注

0 0