美文网首页
LeetCode每日一题:wildcard matching

LeetCode每日一题:wildcard matching

作者: yoshino | 来源:发表于2017-06-22 17:11 被阅读69次

问题描述

> Implement wildcard pattern matching with support for'?'and'*'.
> '?' 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

问题分析

‘?’只能匹配一个字符而’*’可以匹配人一个字符。这题我们可以用动态规划做。设dp[i][j]表示s的前i个字符和p的前j个字符是否匹配。三种情况:

  • 若p[j-1]是‘*’,那么dp[i][j]=dp[i-1][j]||dp[i][j-1],只要s的前i-1和p的前j个或者s的前i和p的前j-1个满足即可。
  • 若p[j-1]是’?’,那么dp[i][j]必须和dp[i-1][j-1]结果相同
  • 若s[i]==p[j],那么dp[i][j]必须和dp[i-1][j-1]结果相同
  • 其他情况: dp[i][j]=false

代码实现

public boolean isMatch(String s, String p) {
        char[] sCharArray = s.toCharArray();
        char[] pCharArray = p.toCharArray();
        boolean[][] dp = new boolean[256][256];
        int l = 0;
        if (p.length() != 0) {
            for (int i = 0; i < p.length(); i++) {
                if (pCharArray[i] != '*') l++;
            }
        }
        if (l > s.length()) return false;//p的字符数加上'?'的数目要小于s的字符数,否则根本不能匹配
        dp[0][0] = true;
        for (int i = 1; i <= p.length(); i++) {
            if (dp[0][i - 1] && pCharArray[i - 1] == '*') dp[0][i] = true;
            for (int j = 1; j <= s.length(); j++) {
                if (pCharArray[i - 1] == '*') dp[j][i] = dp[j][i - 1] || dp[j - 1][i];
                else if (pCharArray[i - 1] == '?' || pCharArray[i - 1] == sCharArray[j - 1])
                    dp[j][i] = dp[j - 1][i - 1];
                else dp[j][i] = false;
            }
        }
        return dp[s.length()][p.length()];
    }

相关文章

网友评论

      本文标题:LeetCode每日一题:wildcard matching

      本文链接:https://www.haomeiwen.com/subject/fqbfcxtx.html