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

來源:力扣(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]; } }