10 正規表示式匹配

2021-09-16 12:04:59 字數 1829 閱讀 9848

思路類似最長公共子串行,

dp[i][j] = dp[i - 1][j - 1], 如果s[i] == p[j] || p[j] == 『.』

dp[i][j - 2], 如果p[j] == 『*』 && s[i] != p[j - 1]

dp[i - 1][j] || dp[i][j - 1] || dp[i - 1][j - 1] || dp[i - 1][j - 2] || dp[i][j - 2], 如果p[j] == 『*』 && s[i] == p[j - 1]

稍稍解釋下:

對於s和p,設各個最後乙個字元為x, y,p的倒數第二字元為z,除此外前面字元設為s,p,則:

s = sx

p = pzy

如果x == y或y == 『.』,則如果s和pz匹配,則s和p匹配,因為最後兩字字母是匹配的。這就縮減了問題規模。

而對於y == '*'的情況,需要考慮z:

如果x != z,則只有在s和p匹配的情況下,s和p才匹配。

如果x == z,設匹配符號為吧,方便,則如果sp,spz,spzy,sxp,sxpz,都可得出s和p匹配。

思路**

class

solution

//當字元模式p為空時,匹配都是失敗

for(

int i =

0;i <= slen;

++i)

//當字串和字元模式都為空時,匹配正確

dp[0]

[0]=

true

;//遍歷字串和模式串

for(

int i =

0;i <= slen;

++i)

else}}

return dp[slen]

[plen];}

};

def

ismatch

(self, s, p)

: m, n =

len(s)

,len

(p)#建立二維陣列時注意裡側的是建立行,外側是建立列,並且需要加一

# dp[i][j] to be true if s[0..i) matches p[0..j) and false otherwise

#dp的下標與s,p差1

dp =[[

false]*

(n+1

)for _ in

xrange

(m+1)]

#初始狀態,很重要

dp[0]

[0]=

true

for i in

xrange(0

, m+1)

:for j in

xrange(1

, n+1)

:#三種情況 分析模式p最後一位

if p[j-1]

=='*'

: dp[i]

[j]= dp[i]

[j-2]or

( i>

0and

(s[i-1]

== p[j-2]

or p[j-2]

=='.'

)and dp[i-1]

[j])

else

: dp[i]

[j]= i>

0and dp[i-1]

[j-1

]and

(s[i-1]

== p[j-1]

or p[j-1]

=='.'

)return dp[m]

[n]

10 正規表示式匹配

implement regular expression matching with support for and matches any single character.matches zero or more of the preceding element.the matching sho...

10 正規表示式匹配

剛開始很奇怪為什麼這個題的標籤是困難,然後寫了出來發現我寫出來的只針對從頭到尾都一樣,而不是如示例4,可以匹配一部分。示例 4 輸入 s aab p c a b 輸出 true 解釋 因為 表示零個或多個,這裡 c 為 0 個,a 被重複一次。因此可以匹配字串 aab 只針對從頭到尾相同的字串的程式...

10 正規表示式匹配

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...