LeetCode10 正規表示式匹配問題

2021-08-22 02:45:48 字數 1369 閱讀 3735

最近上leetcode刷題,碰到正規表示式匹配問題,描述如下:

刷演算法題本人一直遵循kent beck的三部曲:make it work->make it right->make it fast 。

首先,隨機選取乙個測試用例進行匹配模擬操作,你會發現你會很自然地採用逐個字元匹配的方式進行匹配;這就意味著對於該問題的求解實際上可以劃分為若干小問題的求解,那麼到這就會想到可以採用

遞迴的方式來解決該問題。

遞迴的基本思想在於把規模大的問題轉化為規模較小的相似的子問題來解決,根據子問題規模大小又分為兩種策略:線性遞迴(減而治之)和二分遞迴(分而治之);

不過多解釋,上倆圖來描述(有興趣可以去搜尋鄧公的資料結構課程):

減治:

分治:

對於本例,採用線性遞迴的方式來求解:

從遞迴的角度看,為求解 ismatch(s,p),需

遞迴求解規模為 length-1 的問題 ismatch(s,p-1)

遞迴基:ismatch(s[0],p[0])

總體思路如下:

——邊界控制:考慮字元模式p和字串s為空的情況

if (string.isnullorempty(p))

——遞迴基:考慮字元模式長度為1和帶有『*』兩種情形

if (p.length == 1)

if (p[1] != '*')

return (s[0] == p[0] || p[0] == '.') && ismatch(s.substring(1), p.substring(1));

}while (!string.isnullorempty(s) && (s[0] == p[0] || p[0] == '.'))

s = s.substring(1);

}

——遞迴關係

return ismatch(s, p.substring(2));
通過遞迴的方式往往只能make work和right,但是要想高效,對於規模較大的問題遞迴往往不適用。比如,對於常見的斐波那契數列問題,使用直接遞迴方式只能快速計算40+層,越往後時間消耗越長,效率非常低。

直接遞迴可能出現大量的重複子問題(斐波那契數列計算低效的原因),存在大量重複的計算,嚴重影響效能。

LeetCode10 正規表示式

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

LeetCode 10 正規表示式匹配

實現支援 和 的正規表示式匹配。匹配任意單個字元。匹配零個或多個前面的元素。匹配應該覆蓋整個輸入字串 不是部分字串 函式 bool ismatch const char s,const char p 例子 ismatch aa a false ismatch aa aa true ismatch a...

leetCode 10 正規表示式匹配

這道題花了功夫,所以把想到的的寫下來。這個要從字串的屁股開始匹配。道理很簡單,從正面匹配,匹配的方式很多,需要全部列舉,不利於縮小問題規模,舉個例子,aac和a a a c,從正面開始匹配,從全部需要列舉的匹配情況中舉幾個例子 aac匹配a a a c,匹配a a a c,匹配a a a c。從屁股...