LeetCode(44): 通配符匹配

Hard!html

題目描述:算法

給定一個字符串 (s) 和一個字符模式 (p) ,實現一個支持 '?' 和 '*' 的通配符匹配。spa

'?' 能夠匹配任何單個字符。
'*' 能夠匹配任意字符串(包括空字符串)。

兩個字符串徹底匹配纔算匹配成功。指針

說明:code

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

示例 1:htm

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

示例 2:blog

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

示例 3:ip

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

示例 4:字符串

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

示例 5:get

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

解題思路:

這道題通配符匹配問題仍是小有難度的,這道里用了貪婪算法Greedy Alogrithm來解,因爲有特殊字符*和?,其中?能代替任何字符,*能代替任何字符串,那麼咱們須要定義幾個額外的指針,其中scur和pcur分別指向當前遍歷到的字符,再定義pstar指向p中最後一個*的位置,sstar指向此時對應的s的位置,具體算法以下:

- 定義scur, pcur, sstar, pstar

- 若是*scur存在

  - 若是*scur等於*pcur或者*pcur爲 '?',則scur和pcur都自增1

  - 若是*pcur爲'*',則pstar指向pcur位置,pcur自增1,且sstar指向scur

  - 若是pstar存在,則pcur指向pstar的下一個位置,scur指向sstar自增1後的位置

- 若是pcur爲'*',則pcur自增1

- 若*pcur存在,返回False,若不存在,返回True

C語言解法一:

 1 bool isMatch(char *s, char *p) {  2     char *scur = s, *pcur = p, *sstar = NULL, *pstar = NULL;  3     while (*scur) {  4         if (*scur == *pcur || *pcur == '?') {  5             ++scur;  6             ++pcur;  7         } else if (*pcur == '*') {  8             pstar = pcur++;  9             sstar = scur; 10         } else if (pstar) { 11             pcur = pstar + 1; 12             scur = ++sstar; 13         } else return false; 14  } 15     while (*pcur == '*') ++pcur; 16     return !*pcur; 17 }

這道題也能用動態規劃Dynamic Programming來解,寫法跟以前那道題Regular Expression Matching很像,可是仍是不同。外卡匹配和正則匹配最大的區別就是在星號的使用規則上,對於正則匹配來講,星號不能單獨存在,前面必需要有一個字符,而星號存在的意義就是代表前面這個字符的個數能夠是任意個,包括0個,那麼就是說即便前面這個字符並無在s中出現過也無所謂,只要後面的能匹配上就能夠了。而外卡匹配就不是這樣的,外卡匹配中的星號跟前面的字符沒有半毛錢關係,若是前面的字符沒有匹配上,那麼直接返回false了,根本不用管星號。而星號存在的做用是能夠表示任意的字符串,固然只是當匹配字符串缺乏一些字符的時候起做用,當匹配字符串包含目標字符串沒有的字符時,將沒法成功匹配。

C++解法一:

 1 class Solution {  2 public:  3     bool isMatch(string s, string p) {  4         int m = s.size(), n = p.size();  5         vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));  6         dp[0][0] = true;  7         for (int i = 1; i <= n; ++i) {  8             if (p[i - 1] == '*') dp[0][i] = dp[0][i - 1];  9  } 10         for (int i = 1; i <= m; ++i) { 11             for (int j = 1; j <= n; ++j) { 12                 if (p[j - 1] == '*') { 13                     dp[i][j] = dp[i - 1][j] || dp[i][j - 1]; 14                 } else { 15                     dp[i][j] = (s[i - 1] == p[j - 1] || p[j - 1] == '?') && dp[i - 1][j - 1]; 16  } 17  } 18  } 19         return dp[m][n]; 20  } 21 };
相關文章
相關標籤/搜索