實現萬用字元 和?的功能(leetcode44)

2021-09-25 14:37:42 字數 1758 閱讀 2919

題目描述;

給定乙個字串 (s) 和乙個字元模式 (p) ,實現乙個支援'?''*'的萬用字元匹配。

'?' 可以匹配任何單個字元。

'*' 可以匹配任意字串(包括空字串)。

例子:

輸入:s = "aa"

p = "a"輸出:false

輸入:s = "aa"

p = "*"輸出:true

輸入:s = "cb"

p = "?a"輸出:false

輸入:s = "adceb"

p = "*a*b"輸出:true

輸入:s = "acdcb"

p = "a*c?b"輸入:false

思路:(參考:

動態規劃解決該問題,

建立的二位陣列用來存倆個字串匹配的狀態,例如dp[i][j]表示si位置,pj位置是否匹配!

初始化:

dp[0][0]:什麼都沒有,所以為true

第一行dp[0][j],換句話說,s為空,與p匹配,所以只要p開始為*才為true

第一列dp[i][0],當然全部為false

動態方程:

如果(s[i] == p[j] || p[j] == "?") && dp[i-1][j-1] ,有dp[i][j] = true

如果p[j] == "*" && (dp[i-1][j] = true || dp[i][j-1] = true)有dp[i][j] = true

​    note:

​    dp[i][j-1] = true ,表示*代表是空字元,例如ab,ab*

​    dp[i-1][j] = true,表示*代表非空任何字元,例如abcd,ab*

**:(python3.5)

執行結果:

通過

class solution:

def ismatch(self, s: str, p: str) -> bool:

s_len = len(s)

p_len = len(p)

men = [(p_len + 1) * [false] for _ in range(s_len + 1)]

men[0][0] = true

for i in range(1, p_len+1):

men[0][i] = p[i-1] == "*" and men[0][i-1]

for i in range(1,s_len + 1):

for j in range(1,p_len+1):

if p[j-1] == "*":

men[i][j] = (men[i-1][j]) or men[i][j-1]

elif (s[i-1] == p[j-1] or p[j-1] == "?"):

men[i][j] = men[i-1][j-1]

return(men[-1][-1])

Redis事務和實現秒殺功能的實現

今天帶著學生學習了redis的事務功能,redis的事務與傳統的關係型資料庫 如mysql 有所不同,redis的事務不能回滾。redis中使用multi exec discard watch unwatch等命令來操作事務。例如 multi ok incr aaa queued incr bbb ...

Redis事務和實現秒殺功能的實現

今天帶著學生學習了redis的事務功能,redis的事務與傳統的關係型資料庫 如mysql 有所不同,redis的事務不能回滾。redis中使用multi exec discard watch unwatch等命令來操作事務。例如 multi ok incr aaa queued incr bbb ...

萬用字元匹配 講解和python3實現

給定乙個字串 s 和乙個字元模式 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例 1 輸入 s aa p a 輸出...