亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

可視化LeetCode正則表達式問題中的重疊子問題和DP的使用

可視化LeetCode正則表達式問題中的重疊子問題和DP的使用

Helenr 2021-12-18 15:38:58
我剛剛在 leetcode.com 上使用遞歸解決了這個問題(10.正則表達式匹配)。我能夠理解遞歸解決方案。但是,當我看到這段代碼的優化版本時,建議我應該使用Dynamic Programming。我不明白為什么我們需要動態編程?我沒有看到這個問題有重疊的子問題。我們為什么要使用記憶或制表?我無法想象重疊的子問題。這是我到目前為止到達的地方。這是我的解決方案:public static boolean isMatch(String text, String pattern) {if (pattern.isEmpty())    return text.isEmpty();boolean first_match = (!text.isEmpty() && (pattern.charAt(0) == text.charAt(0) || pattern.charAt(0) == '.'));if (pattern.length() >= 2 && pattern.charAt(1) == '*') {    return isMatch(text, pattern.substring(2))|| first_match && isMatch(text.substring(1), pattern);} else {    return first_match && isMatch(text.substring(1), pattern.substring(1));}我對遞歸解決方案的理解是,我可以看到模式中的下一個字符是否是 *,那么可能有兩種情況:我們跳過當前字符和下一個字符(*)并從索引 2 中獲取模式的子字符串,并將模式的剩余子字符串與當前文本進行匹配。這說明 * 前的字符出現“0”次。模式中的 * 將不斷吸收文本中的匹配字符。只要我們繼續獲得相同的角色,他們就會繼續匹配明星,我們就會繼續前進。另一種情況是,如果下一個字符不是“*”,那么我們檢查當前字符是否匹配,如果是,則檢查兩者的剩余子字符串。我嘗試使用以下方法進行干運行:輸入:s = "mississippi" p = "mis*is*p*." 輸出:假我可以想象第一個 m 和 m 匹配,i 和 i 匹配(到目前為止是線性遞歸)?,F在開始復雜的部分,因為 s 和 s 匹配但 s 的下一個字符是星號。如果我調用,匹配 '0' 出現作為場景 1 并吸收 * 作為場景 2 中的匹配字符,那么遞歸調用將如下所示:場景 1: text 是 ssissippi ,剩余模式是p。s 和 i 字符不匹配場景 2:剩余文本是 sissippi,模式是 s是p*。場景 1:文本是 sissippi,剩余模式是p。s 和 i 字符不匹配場景 2:剩余文本是 issippi,模式是 s是p*。場景 1: text 是 issippi ,剩余模式是p。字符匹配所以下一個遞歸調用文本:ssippi 和模式為:s p。場景 1:文本為 ssippi,剩余模式為 p*。場景 1:文本為 ssippi,剩余模式為 .字符匹配所以下一個遞歸調用文本:sippi 和模式為:場景 2:剩余文本為 sippi,模式為 p*。場景 2:剩余文本為 sippi ,模式為 s p。場景 1:文本是 sippi,剩余模式是 p*。場景 1:文本是 sippi,剩余模式是 .字符匹配,因此下一個遞歸調用與文本:ippi 和模式為:場景 2:剩余文本為 ippi,模式為 p*。場景2:剩余文本為 ippi ,模式為 s p。場景 1:文本為 ippi,剩余模式為 p*。場景1:文本為ippi,剩余模式為.字符匹配所以下一個遞歸調用文本:ppi 和模式為:場景 2:剩余文本為 ppi,模式為 p*。場景2:剩余文本為 ppi ,模式為 s p。場景 2:剩余文本是 ssippi,模式是 s是p*。最后返回False。在此解決方案中,我無法確定是否存在任何重疊的子問題或任何我們可以重用的解決方案?我什至嘗試在youtube上查找。這家伙沒有告訴我們是如何得到這個解決方案的,他只是簡單地試運行這個解決方案,因為他知道這是一個 DP 問題。我們如何確定這是否是 DP 問題?為這個問題達成 DP 解決方案背后的直覺是什么?我在互聯網上查了很多資料,但我仍然無法弄清楚重疊的子問題在哪里,以及我們如何得出結論是否是 DP 問題。我也嘗試為這個樹制作一個遞歸樹,但仍然無法弄清楚我們可以在哪里重新使用以前計算的解決方案。任何人都可以幫助我想象重疊的子問題,并幫助我得出結論,您如何確定它是否是 DP 問題并找到自下而上的解決方案?
查看完整描述

1 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

這是一個測試用例, text = "hhT", pattern = ".*h.*P"。

嘗試在isMatch函數調用的第一行打印文本和模式。您會看到文本"T"和圖案".*P"出現兩次。所以是的,這個問題確實有重疊的子問題。

我努力想出一個例子的部分原因是你的代碼非常優雅。我寫得比較糟糕的代碼有更多的重疊。

之所以發生這種情況,"hh"是因為可以通過兩種方式使用文本。該"h"圖案可以被匹配到第一和第二"h"文本的。但無論哪種方式,匹配"hh"都會".*h"從模式中獲取,而你只剩下"T"and ".*P"。

因此,與斐波那契或其他經典 DP 問題不同,這里的子問題重疊并不能保證發生。但它可能會發生,特別是當您有很多特殊字符時。


查看完整回答
反對 回復 2021-12-18
  • 1 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號