1. 程式人生 > 實用技巧 >LeetCode 44. 萬用字元匹配 dp

LeetCode 44. 萬用字元匹配 dp

地址https://leetcode-cn.com/problems/wildcard-matching/

給定一個字串(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

演算法1
和 Leetcode 正則式匹配類似
從逐步減少字串長度慢慢過度到dp

C++ 程式碼

class Solution {
public:
    vector
<vector<int>> dp; bool isMatch(string s, string p) { int m =s.size();int n = p.size(); dp = vector<vector<int>>(m+10,vector<int> (n+10)); dp[0][0] = 1; s.insert(s.begin(), '^'); p.insert(p.begin(), '^'); for (int i = 0; i < s.size(); i++) {
for (int j = 0; j < p.size(); j++) { if (p[j] != '*' && i>=1 && j>=1 && (p[j] == '?' || p[j] == s[i])) { dp[i][j] |= dp[i - 1][j - 1]; } if (p[j] == '*' ) { if(i >= 1) dp[i][j] |= dp[i - 1][j] ; if(j >= 1)dp[i][j] |= dp[i][j-1]; } } } return dp[s.size()-1][p.size()-1]; } };