《劍指offer》17 判斷正則式是否匹配

2021-10-24 20:09:39 字數 2182 閱讀 6518

應該說,在《劍指offer》前半的題目中,正則式匹配無論是新穎程度還是難度都是比較高的一題。題目給出乙個字串和乙個帶有「.」與「 * 」的正規表示式,求問這個表示式和原字串是否匹配。

其中的匹配規則是:字元 . 表示任意乙個字元,而「」 * 「」表示它前面的字元可以出現任意次(包含0次)

舉個例子:

字串"aaa"與模式"a.a"和"ab*ac*a"均匹配

字串"aaa"與"aa.a"和"ab*a"均不匹配

題目有點繞,但是即便沒接觸過sql的朋友應該也是接觸過正規表示式的。簡單的說就是判斷.與 * 的模式匹配問題。但是這其中實際涉及很多雞毛的細節。

這個問題的核心是 * ,對於 . 我們只需要看它是不是剛好對應乙個字元位就行了,所以我們的主要精力應該放在 * 上面。

首先第乙個字元肯定不為 * ,那麼依循主流思想,從第二個字元是否為 * 考慮——

如果第二個字元為 * ,那麼會出現以下四種情形:

字串為「aabb」

pattern1: c*aabb 首字元不相等,只能將pattern後移兩個字元;

pattern2: a*aabb 此時首字元雖然相等,但也需要把 * 前面的字元看作出現0次,才能匹配成功;

pattern3: a*abb 首字元相等,把 * 前面的字元看作出現1次,進行正常匹配;

pattern4: a*bb 首字元相等,但這時需要把 * 前面的字元看作出現多次(2次及以上),才能進行匹配。

只要這四種情況中有匹配成功的一種,那麼就可以繼續向下走,否則return false

如果第二個字元不為 * ,那麼就更簡單一些,我們就可以直接比較字串和正規表示式的兩個首字元,不匹配就return false,匹配的話就繼續向後移動考察。

無論第二個字元是否為 * ,在向後移動的過程中,考慮遞迴是一種比較快捷和偷懶的形式。就是**本身可能比較繞。

# offer17-solution

class

solution

:# s, pattern都是字串

defmatch

(self, s, pattern):if

len(s)==0

andlen

(pattern)==0

:return

true

iflen

(s)>

0and

len(pattern)==0

:return

false

# 當模式中的第二個字元是"*"時

iflen

(pattern)

>

1and pattern[1]

=="*"

:# 如果字串第乙個模式跟模式第乙個字元匹配(相等或匹配到"."),可以有3種匹配方式:

iflen

(s)>

0and

(s[0

]== pattern[0]

or pattern[0]

=='.'):

# 1、模式後移2字元,相當於x*被忽略

# 2、字串後移1字元,模式後移兩字元;

# 3、字串後移1字元,模式不變,即繼續匹配字元下一位,因為*可以匹配多位

return self.match(s, pattern[2:

])or self.match(s[1:

], pattern[2:

])or self.match(s[1:

], pattern)

else

:return self.match(s, pattern[2:

])# 當模式中的第二個字元不是"*"時:

# 1、如果字串第乙個字元和模式中的第乙個字元匹配(相等或匹配到"."),那麼字串和模式都後移乙個字元,然後匹配剩餘的

iflen

(s)>

0and

(s[0

]== pattern[0]

or pattern[0]

=='.'):

return self.match(s[1:

], pattern[1:

])# 2、如果字串第乙個字元和模擬中的第乙個字元相不匹配,直接返回false

return

false

劍指offer 17 樹的子結構

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 這是典型二叉樹遞迴問題。倆顆樹都不為空時,如果根節點相同,那麼判斷root2是不是root1的子樹,如果不是,那麼判斷root2是不是root1左子樹的子樹,如果還不是,那麼判斷root2是不是root1右子樹的...

劍指Offer (17)樹的子結構

題目描述 輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 實現如下 分兩步 第一步 尋找與b樹根節點val相等的a樹節點。如果找到進入第二步,否則繼續尋找,直到找完a樹 第二步 以找的節點作為a樹子樹的根節點,同時遍歷兩棵樹,判斷是否所有節點都相同 特殊情況 ...

劍指offer(17)樹的子結構

19.1.11 題目描述 輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 思修很簡單 遍歷a樹,每個a節點與b對比,對比函式為solution。如下 function treenode x function hassubtree proot1,proot2 r...