經典題目 正規表示式匹配

2021-10-01 06:16:25 字數 1346 閱讀 1513

引例:請實現乙個函式用來匹配包括'.'和'*'的正規表示式。模式中的字元'.'表示任意乙個字元,而'*'表示它前面的字元可以出現任意次(含0次)。在本題中,匹配是指字串的所有字元匹配整個模式。

例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配。

本題可通過動態規劃解決,建立二維陣列f,f[i][j]為true表示字串s中從i到末尾的子串行與模式串p從j到末尾的子串行是匹配的。

在開始之前我們先只看當前位什麼情況下匹配。很明顯當 s[i] == p[j]或p[j] == '.'時當前位才匹配,不妨把當前位的匹配狀態設為match。

接下來就要考慮『*』的作用了,它表示當前位出現0次或多次,正是它的出現使問題複雜了。不妨分兩種情況討論,分別是有*和無*的情況。

1. 當p[j+1] != '*'時:此時在match為true的基礎,f[i+1][j+1]也為true時,f[i][j]才為true。

2. 當p[j+1] == '*'時:正如我們前面所說,它表示p[j]這個字元出現0次或多次,所以我們也分兩種情況進行討論:

2.1 當p[j]出現0次時,也就是說第j項不存在,所以f[i][j]要為true的話,f[i][j+2]必須是true的。(相當於跳過p[j]這個字元,比較下一位,即p[j+2])

2.2 當p[j]出現多次時,此時我們自然會想到底出現多少次才能匹配呢?但是我們用動態規劃的思想考慮一下,p[i][j]的結果依賴於p[i+1][j]的結果,所以不妨直接遞迴這個過程。如下圖所示:

圖1 字串匹配過程圖

由於p[j+1]是*,需要從s序列中找最多能匹配多少位,如圖所示,最多匹配到第5位,當匹配到第6位時,match為false,所以p[6][0]就是false,進而p[5][0]、p[4][0]、p[3][0]……一直到當前的p[i][j]都是false,於是得到本層結果。

這樣經過上面的兩步,便可以得到結果。

class

solution

booldp(

int x,

int y, string& s, string& p)

bool match = x < n &&

(s[x]

== p[y]

|| p[y]

=='.');

bool ans;

if(y +

1< m && p[y +1]

=='*'

)else

return f[x]

[y]= ans;}}

;

經典演算法正規表示式匹配

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

正規表示式 匹配

字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...

正規表示式匹配

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