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 的小
【LeetCode】44. 萬用字元匹配
題目描述 思路(與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自動機。 而有的“通配子串”可能含