Python中的萬用字元匹配
假設我們有一個輸入字串 s 和另一個輸入字串 p。這裡 s 是主字串,p 是模式。我們必須定義一個方法,能夠在字串中匹配模式。所以我們必須為支援像“?”和“*”這樣的萬用字元的正則表示式實現它。
點“?”匹配任何單個字元
星號“*”匹配零個或多個字元。
例如,如果輸入類似於 s = “aa” 和 p = “a?”,則結果為真;對於相同的輸入字串,如果模式是“?*”,則結果也為真。
為了解決這個問題,我們將遵循以下步驟:
ss := s 的大小,ps := p 的大小
建立一個大小為 ss x ps 的 dp 矩陣,並使用 false 值填充它
在這些字串之前新增一個空格來更新 p 和 s
對於範圍 1 到 ps 中的 i:
如果 p[i] 為星號,則
dp[0, i] := dp[0, i - 1]
對於範圍 1 到 ss 中的 i
對於範圍 1 到 ps 中的 j
如果 s[i] 等於 p[j],或者 p[j] 為“?”,則
dp[i, j] := dp[i – 1, j – 1]
否則,當 p[j] 為星號時,則
dp[i, j] := dp[i – 1, j] 和 dp[i, j – 1] 的最大值
返回 dp[ss, ps]
示例(Python)
讓我們看看下面的實現,以便更好地理解:
class Solution(object): def isMatch(self, s, p): sl = len(s) pl = len(p) dp = [[False for i in range(pl+1)] for j in range(sl+1)] s = " "+s p = " "+p dp[0][0]=True for i in range(1,pl+1): if p[i] == '*': dp[0][i] = dp[0][i-1] for i in range(1,sl+1): for j in range(1,pl+1): if s[i] == p[j] or p[j] == '?': dp[i][j] = dp[i-1][j-1] elif p[j]=='*': dp[i][j] = max(dp[i-1][j],dp[i][j-1]) return dp[sl][pl] ob = Solution() print(ob.isMatch("aa", "a?")) print(ob.isMatch("aaaaaa", "a*"))
輸入
"aa", "a." "aaaaaa", "a*"
輸出
True True
廣告