LeetCode 44. 萬用字元匹配 dp
阿新 • • 發佈:2020-12-17
地址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]; } };