應該說,在《劍指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...