leetcode: Wildcard Matching

来源:互联网 发布:保健品网络推广方案 编辑:程序博客网 时间:2024/06/03 04:26

动态规划,不过状态转换方程比较复杂

isMatch( a, b) = ((a.last = b.last || b.last == '?' ) && isMatch(a-1, b-1)) || ( b.last == '*' && ( isMatch(a-1, b) || isMatch(a, b-1) || isMatch(a-1, b-1))

也就是

if( p[i-1] == '*')
                    dp[j][i] = dp[j-1][i] || dp[j][i-1] || dp[j-1][i-1];
                else if( p[i-1] == s[j-1] || p[i-1] == '?')
                    dp[j][i] = dp[j-1][i-1];
                else
                    dp[j][i] = false;

class Solution {public:    bool isMatch(const char *s, const char *p) {        int s_len = strlen(s);        int p_len = strlen(p);        int cnt = 0;        for( int i = 0; i < p_len; ++i){            if( *(p+i) != '*')                ++cnt;        }        if( cnt > s_len)            return false;        bool dp[s_len+1][p_len+1];        memset(dp, false, sizeof(dp));        dp[0][0] = true;        for( int i = 1; i <= p_len; ++i){            if( dp[0][i-1] && p[i-1] == '*')                dp[0][i] = true;            for( int j = 1; j <= s_len; ++j){                if( p[i-1] == '*')                    dp[j][i] = dp[j-1][i] || dp[j][i-1] || dp[j-1][i-1];                else if( p[i-1] == s[j-1] || p[i-1] == '?')                    dp[j][i] = dp[j-1][i-1];                else                    dp[j][i] = false;            }        }        return dp[s_len][p_len];    }};


0 0
原创粉丝点击