遞迴改動態規劃 正則匹配

2021-10-20 13:28:13 字數 1859 閱讀 2564

題目描述

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

遞迴解法,​原因都在注釋裡: ​

public

class

solution

// 看 str[si...ends] 的字元, 能不能被 pattern[pi...ends] 所匹配

private

boolean

process

(char

str,

char

pattern,

int si,

int pi)

// 如果 pi 來到了最後乙個字元; 或者 pi 的下乙個字元 不是 *

if(pi +

1== pattern.length || pattern[pi +1]

!='*'

)// str 要有字元可以匹配,

// pattern 上是 . 或者 pattern和str的字元可以匹配;

// * 可以匹配0位或任意位:所以這個while迴圈就是匹配 0 ... str.length 位的情況,有true直接 返回即可

while

(si != str.length &&

(str[si]

== pattern[pi]

|| pattern[pi]

=='.'))

si++;}

// str 字元走完了, 看 pattern 之後的能不能匹配

return

process

(str, pattern, si, pi+2)

;}}

動態規劃解法 :

class

solution

if(str == null || pattern == null)

int slen = str.length;

int plen = pattern.length;

// 初始化 dp 矩陣

boolean

dp =

initdp

(str, pattern)

;// 填充 dp 矩陣

for(

int i = slen -

1; i >=

0; i--

)else

si++;}

// str 走完單獨算一下, 上面的 str[si] 中會越界

if(dp[i]

[j]==

false)}

}}// 想要的結果

return dp[0]

[0];

}// 該 dp 矩陣中, (i, j) 依賴 (i+1, j+1) 和 (i, j+2),(i+1, j+2)...(str.length, j+2) 的位置

// 所以, 要先把最後 2 列, 最後 1 行, 填充完整。 這樣就可以推導出任何一點位置上的值了

private

boolean

initdp

(char

str,

char

pattern)

// 倒數第一行: str 走完了, 就看 pattern 是否可以匹配。

for(

int j = plen -

2; j >=

0; j = j -2)

else

}return dp;

}}

22 1 26 遞迴改動態規劃

1.套路 1 遞迴 根據題目寫出遞迴版本 2 記憶化搜尋 用某種結構儲存已經計算過的資訊,省去重複計算的過程 3 嚴格表結構 將遞迴套路轉化為填表,注意考慮越界問題 2.問題分析 1 機械人走路問題 code 暴力遞迴版本 public static int process int n,int e,...

動態規劃 遞迴

動態規劃是求解包含重疊子問題的最優化方法 1.基本思想 將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解 注意 不是簡單分而治之 2.只能應用於有最優子結構的問題 即區域性最優解能決定全域性最優解,或問題能分解成子問題來求解 3.具有無後效性。它要求每乙個問題的決策,不能夠對解...

正規表示式匹配問題的遞迴和動態規劃解法

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