1. 程式人生 > >LeetCode-44.萬用字元匹配(考察點:動態規劃)

LeetCode-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

解題思路:動態規劃,構建輔助陣列dp,dp[i][j]表示s(0~i-1)與p(0~j-1)子串是否完全匹配

需s和p完全匹配,外層迴圈對p進行遍歷,內層迴圈對待匹配字串s進行遍歷,每次對S的當前字元(s[i-1])進行匹配時,判斷p的當前字元(p[j-1])是否為'*';

若p[j-1]不為*,需判斷s(0~i-2)與p(0~j-2)是否匹配(即dp[i-1][j-1]),並且s[i-1]與p[j-1]匹配

若p[j-1]為,需判斷s(0~i-2)與p(0~j-1)是否匹配(當前匹配s[i-1]及之前部分字元),或者判斷s(0~i-1)與p(0~j-2)是否匹配(當前*匹配空字串)

java程式碼:

class Solution {
    int len1 = s.length(), len2 = p.length();
    //輔助陣列dp,dp[i][j]表示s(0~i-1)與p(0~j-1)子串是否完全匹配
    boolean[][] dp = new boolean[len1+1][len2+1];
    dp[0][0] = true;//s為空字串 && p為空字串
    for(int i = 1; i <= len1; i++)
        dp[i][0] = false;//s不為空,p為空字串
    for(int j = 1; j <= len2; j++)
        dp[0][j] = (p.charAt(j-1) == '*' && dp[0][j-1]);//s為空字串,p不為空

    //需s和p完全匹配,外層迴圈對p進行遍歷
    for(int j = 1; j <= len2; j++)
        for(int i = 1; i <= len1; i++){
            if(p.charAt(j-1) != '*')
                //若p[j-1]不為*,需判斷s(0~i-2)與p(0~j-2)是否匹配(即dp[i-1][j-1]),並且s[i-1]與p[j-1]匹配
                dp[i][j] = dp[i-1][j-1] && (s.charAt(i-1) == p.charAt(j-1) || '?' == p.charAt(j-1));
            else
                //若p[j-1]為*,需判斷s(0~i-2)與p(0~j-1)是否匹配(當前*匹配s[i-1]及之前部分字元)
                //或者判斷s(0~i-1)與p(0~j-2)是否匹配(當前*匹配空字串)
                dp[i][j] = dp[i-1][j] || dp[i][j-1];
        }

    return dp[len1][len2];
}

注:陣列長度為[len1+1][len2+1]是為了避免s為空時或者p為空時,陣列越界,並且這樣寫可以不用額外判斷s為空或者p為空字串時的特殊情況

相關推薦

LeetCode-44.字元匹配考察點動態規劃

給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p

leetcode 44. 字元匹配

給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹

python leetcode 044 字元匹配困難解題報告

給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。'?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。說明:s 可能為空,且只包含從 a-z 的小寫字母。p 可能為空,且只包含

Leetcode 44字元匹配超詳細的解法!!!

給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。

leetcode 44 ---- 動態規劃困難 字元匹配java

1.  問題:給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小

LeetCode44. 字元匹配

題目描述 思路(與10. 正則表示式匹配類似) dp[ i ][ j ] 表示 s 的前 i 個字元與 p 的前 j 個字元的匹配結果。 先寫邊界情況,再寫 dp 方程,若 p[ j - 1] 為 * ,dp[ i ][ j ] = dp[ i - 1][ j

44. 字元匹配

給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p

華為機試購物單考點動態規劃

題目:分析:這是一道01揹包問題,有一個限制條件就是附件必須要在主件購買的前提下才能購買。本題的總錢數就類似於揹包問題中的總重量,價格與重要度乘積的總和就類似於揹包問題中的價值。定義陣列dp[i][j]表示前i件物品花費j所得到的最大價值,對於每件物品可以選擇放或者不放,具體

LeetCode 10 & 44 正則表示式匹配 & 字元匹配 字串匹配問題

10 正則表示式匹配 給定一個字串 (s) 和一個字元模式 (p)。實現支援 ‘.’ 和 ‘*’ 的正則表示式匹配。 ‘.’ 匹配任意單個字元。 ‘*’ 匹配零個或多個前面的元素。 匹配應該覆蓋整個字串 (s) ,而不是部分字串。 說明: s 可能為

leetCode】44_字元匹配

dp: class Solution { public: bool isMatch(string s, string p) { //tag 用於dp,tag[i][j]代表s的子串s[0,i-1] 可以匹配 p的子串p[0,j-1]。

LintCode 192字元匹配

題目 判斷兩個可能包含萬用字元“?”和“*”的字串是否匹配。匹配規則如下: '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個串完全匹配才算匹配成功。 函式介面如下: bool isMatch(const char *s, const

Struts2 學習之路2.4 Struts2(2.5.14.1版本)中的字元匹配問題

struts.xml 配置檔案中萬用字元的匹配 可以匹配action節點中的class屬性,method屬性,result子節點的name屬性,甚至是result子節點的路徑內容 因為2.5.x版本

[leetcode] Wildcard Matching 字元匹配

也是《劍指offer》中的題目 問題描述: 判斷兩個可能包含萬用字元“?”和“*”的字串是否匹配。匹配規則如下: '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個串完全匹配才算匹配成功。 介面如下:其中s為待匹配串(不含'?'和'*'

day26基礎加強泛型、字元、註解、反射 註解使用

泛型 1、具有一個或多個泛型變數的型別被稱之為泛型類 class A<T>{} 2、在建立泛型類例項時,需要為其型別變數賦值 A<String> a = new A<String>(); 如果建立例項時,不給型別變數賦值,那麼會有一個警告。 3

[Luogu P3167] [BZOJ 3507] [CQOI2014]字元匹配

洛谷傳送門 BZOJ傳送門 題目描述 幾乎所有作業系統的命令列介面(CLI)中都支援檔名的萬用字元匹配以方便使用者。最常見的萬用字元有兩個,一個是星號(*),可以匹配 0

D-動態規劃比遞迴快-LeetCode44-字元匹配

題目 給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p 可能為空,且只包含

字元匹配

給定一個字串 (s) 和一個字元模式 § ,實現一個支援 ‘?’ 和 ‘*’ 的萬用字元匹配。 ‘?’ 可以匹配任何單個字元。 ‘*’ 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p 可能為空,且只包含

字元匹配_講解和python3實現

題目描述 給定一個字串 (s) 和一個字元模式 § ,實現一個支援 ‘?’ 和 ‘*’ 的萬用字元匹配。 ‘?’ 可以匹配任何單個字元。 ‘*’ 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p 可能

HDFS之globStatus()函式字元匹配製定模式的路徑liststatus() 列出目錄下的所有檔案

Globstatus.java import java.io.IOException; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.

bzoj3507 [Cqoi2014]字元匹配

我們將題目輸入的那個含萬用字元的串,記為“萬用字元串”,下面的檔名記為“檔名”,“檔名”數量很少可以依次查詢。 我們先將“萬用字元串”以‘*’為界,將“萬用字元串”分解,得到若干子串,記為“通配子串” 我們將每個“通配子串”各建立一個AC自動機。 而有的“通配子串”可能含