題目描述
請實現乙個函式用來匹配包括』.『和』『的正規表示式。模式中的字元』.『表示任意乙個字元,而』'表示它前面的字元可以出現任意次(包含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 均不匹配。使用遞迴來實現每一步的比較。看模式...