思路類似最長公共子串行,
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 的小寫字母,以及字元 和 示例...