44. 萬用字元匹配-動態規劃-困難
阿新 • • 發佈:2020-07-19
問題描述
給定一個字串(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'。
輸入:
s = "adceb"
p = "*a*b"
輸出: true
解釋:第一個 '*' 可以匹配空字串, 第二個 '*' 可以匹配字串 "dce".
示例5:
輸入:
s = "acdcb"
p = "a*c?b"
輸出: false
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/wildcard-matching
解答
//第10的簡化版,dp找規律 class Solution { public boolean isMatch(String s, String p) { int s_len = s.length();int p_len = p.length(); boolean[][] res = new boolean[p_len+1][s_len+1]; res[0][0] = true; //初始化第一列 for(int i=1;i<p_len+1;i++)if(res[i-1][0] && p.charAt(i-1) == '*')res[i][0] = true; for(int i=1;i<p_len+1;i++)//每行 for(int j=1;j<s_len+1;j++){//每列 if(p.charAt(i-1) == '*' && (res[i-1][j] || res[i][j-1] || res[i-1][j-1]))res[i][j] = true; else if(p.charAt(i-1) == '?' && res[i-1][j-1])res[i][j] = true; else if(p.charAt(i-1) == s.charAt(j-1) && res[i-1][j-1])res[i][j] = true; } return res[p_len][s_len]; } }