劍指OFFER筆記 19 正規表示式匹配

2021-10-07 10:03:22 字數 2248 閱讀 3697

**此題可以利用動態規劃法。因為它滿足應用動態規劃法的兩個必要條件,乙個是可以劃分為比較小的問題,使其容易求解;二是可以將答案重新組合起來形成最終的答案。

本題可以採用從後往前縮小和從前往後縮小範圍兩種。我採用了從後往前。

首先檢測string和pattern的最後一位。此時有三種情況:

pattern的最後一位為字母。這是一種簡單情況,只需要去使其和string最後一位作比較。若相同,則string和pattern將長度減1,繼續檢測之前的部分是否匹配,若不同,直接返回false。

pattern的最後一位為』.』。這也是一種簡單情況,只需要string還有字元去匹配就也可以分別將長度減1,繼續檢測。

pattern的最後一位為』*』。這種情況下,『*』需要分三種情況去看待。

1. 『*『前的元素匹配了0次。此時將string的下標上限不變,pattern的下標上限-2,略過』*』,繼續檢測。

2. 『*『前的元素匹配了1次。此時將string的下標上限減1,pattern的下標上限-2,略過』*』,繼續檢測。

3. '*'前的元素匹配了超過1次。此時將string的下標上限減1,pattern的下標上限不變,繼續檢測。

在加上一些邊界情況的判斷即可以寫出**了。

package q19;

public

class

solution

if(s.

length()

==0&& p.

length()

==0) char[

] schar = s.

tochararray()

; char[

] pchar = p.

tochararray()

;return

match

(schar, pchar, schar.length-

1, pchar.length-1)

;}public boolean match

(char[

] string, char[

] pattern, int sindex, int pindex)

//若字串未全部消除,模式已經全部消除,返回false

if(sindex >-1

&& pindex <=-1

)//若字串已全部消除,模式未全部消除,單獨考慮

if(sindex <=-1

&& pindex >-1

)//字串和模式都有剩餘的情況。

//若模式結尾是字母,檢測與字串結尾是否匹配,不匹配返回false,匹配則遞迴呼叫,index同時減1

if(pattern[pindex]

!='.'

&& pattern[pindex]

!='*'

)return

match

(string, pattern, sindex-

1, pindex-1)

;}//若模式結尾是'.',任意情況都可以index同時減1

if(pattern[pindex]

=='.')if

(pattern[pindex]

=='*'

)//若匹配不上,則視'*'為0次

else

}return

false;}

/** * 此函式檢測此段模式是否可以匹配空字串

* @param pattern 模式

* @param pindex 此段模式的下標上限

* @return 若能匹配空字串,返回true。若不能,返回false。

劍指Offer 19 正規表示式匹配

之前做這個題的時候特別凌亂,但這次會好很多,把思路分享出來,以及邊界的確定 思路 我們用倆個索引來控制字串和模式串已經匹配到達的位置,index1和index2,這個問題就難在有 的位置,我們需要考慮下乙個位置為 時候怎麼處理 1.模式串的index2下乙個位置為 1 字串的index1位置與模式串...

劍指offer19 正規表示式匹配

2.如果第二位是 第一位如果匹配,則三種情況 有一種為true,則結果為true 3.其餘情況一位一位比較 class solution s,pattern都是字串 defmatch self,s,pattern write code hereif len s 0 andlen pattern 0 ...

劍指offer 19 正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 ab a 表示b可以出現任...