1. 程式人生 > >44. 萬用字元匹配

44. 萬用字元匹配

給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。

'?' 可以匹配任何單個字元。
'*' 可以匹配任意字串(包括空字串)。

兩個字串完全匹配才算匹配成功。

說明:

  • s 可能為空,且只包含從 a-z 的小寫字母。
  • p 可能為空,且只包含從 a-z 的小寫字母,以及字元 ? 和 *

示例 1:

輸入:
s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字串。

示例 2:

輸入:
s = "aa"
p = "*"
輸出: true
解釋: '*' 可以匹配任意字串。

示例 3:

輸入:
s = "cb" p = "?a" 輸出: false 解釋: '?' 可以匹配 'c', 但第二個 'a' 無法匹配 'b'。

示例 4:

輸入:
s = "adceb"
p = "*a*b"
輸出: true
解釋: 第一個 '*' 可以匹配空字串, 第二個 '*' 可以匹配字串 "dce".

示例 5:

輸入:
s = "acdcb"
p = "a*c?b"
輸入: false

class Solution {
public:
    bool isMatch(string s, string p) {
        int m=s.length();int n=p.length();
        int i=0,j=0,match,asterisk = -1;
        while(i<m){
            if(j<n&&p[j]=='*'){
                match=i;
                asterisk=j++;
            }
            else if(j<n&&(s[i]==p[j]||p[j]=='?')){
                i++;j++;
            }
            else if(asterisk>=0){
                i=++match;
                j=asterisk+1;
            }
            else return false;
        }
        while(j<n&&p[j]=='*')j++;
        return j==n;
    }
};