美文网首页
044 Wildcard Matching

044 Wildcard Matching

作者: 烟雨醉尘缘 | 来源:发表于2018-12-28 19:34 被阅读0次

    Given an input string (s) and a pattern (p), 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).

    Example:

    Input:
    s = "aa"
    p = "a"
    Output: false
    Explanation: "a" does not match the entire string "aa".

    Input:
    s = "aa"
    p = "*"
    Output: true
    Explanation: ' * ' matches any sequence.

    Input:
    s = "cb"
    p = "?a"
    Output: false
    Explanation: '?' matches 'c', but the second letter is 'a', which does not match 'b'.

    Input:
    s = "adceb"
    p = "ab"
    Output: true
    Explanation: The first '' matches the empty sequence, while the second '' matches the substring "dce".

    Input:
    s = "acdcb"
    p = "a*c?b"
    Output: false

    Note:

    s could be empty and contains only lowercase letters a-z.
    p could be empty and contains only lowercase letters a-z, and characters like ? or *.

    解释下题目:

    自己实现通配符。

    1. 二维矩阵判断法,从这里借鉴的

    实际耗时:59ms

    public boolean isMatch(String s, String p) {
            boolean[][] match = new boolean[s.length() + 1][p.length() + 1];
            match[s.length()][p.length()] = true;
            for (int i = p.length() - 1; i >= 0; i--) {
                if (p.charAt(i) != '*')
                    break;
                else
                    match[s.length()][i] = true;
            }
            for (int i = s.length() - 1; i >= 0; i--) {
                for (int j = p.length() - 1; j >= 0; j--) {
                    if (s.charAt(i) == p.charAt(j) || p.charAt(j) == '?')
                        match[i][j] = match[i + 1][j + 1];
                    else if (p.charAt(j) == '*')
                        match[i][j] = match[i + 1][j] || match[i][j + 1];
                    else
                        match[i][j] = false;
                }
            }
            return match[0][0];
        }
    

      思路就是默认是匹配的,然后两个从最后开始匹配,简单说就是目前匹配与否,取决于之前是否匹配,如果匹配那么判断当前是否匹配,如果匹配则“继承”之前的状态,如果不匹配则直接false

    时间复杂度O(n*m)
    空间复杂度O(n*m)

    相关文章

      网友评论

          本文标题:044 Wildcard Matching

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