LeetCode-10 正則表達式匹配

LeetCode-10 正則表達式匹配

動態規劃

10. 正則表達式匹配

dp數組含義dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i?1]s[0:i-1]s[0:i?1] 能否被 p[0:j?1]p[0:j-1]p[0:j?1] 成功匹配。

狀態轉移方程

  • 如果 s[i?1]==p[j?1]s[i-1]==p[j-1]s[i?1]==p[j?1] ,那么當前字符是匹配成功了,整個子串是否匹配成功取決于之前的子串能否匹配,即 dp[i][j]=d[i?1][j?1]dp[i][j]=d[i-1][j-1]dp[i][j]=d[i?1][j?1]
  • 如果 s[i?1]≠p[j?1]s[i-1]\ne p[j-1]s[i?1]?=p[j?1] ,可以按 p[j?1]p[j-1]p[j?1] 是什么分三種情況:
    • 如果 p[j?1]p[j-1]p[j?1].* 之外的字符,那肯定不匹配了,dp[i][j]=falsedp[i][j]=falsedp[i][j]=false
    • 如果 p[j?1]==′.′p[j-1]=='.'p[j?1]==. ,由于 . 可以匹配任何字符,因此當前字符也肯定匹配成功了,還是取決于之前的子串,即 dp[i][j]=dp[i?1][j?1]dp[i][j]=dp[i-1][j-1]dp[i][j]=dp[i?1][j?1]
    • 如果 p[j?1]==′?′p[j-1]=='*'p[j?1]==? ,情況比較復雜,需要再看 p[j?2]p[j-2]p[j?2]s[i?1]s[i-1]s[i?1] 的關系,因為 p[j?2]p[j-2]p[j?2] 要與 s[i?1]s[i-1]s[i?1] 匹配上,p[j?1]p[j-1]p[j?1] 的這個 * 才有用
      • 而所謂 ”匹配上“,可能有兩種情況,一個是字符相同,即 p[j?2]=s[i?1]p[j-2]=s[i-1]p[j?2]=s[i?1];另一個是 p[j?2]p[j-2]p[j?2]. ,匹配任意字符。可以再按照 p[j?1]p[j-1]p[j?1] 這個 *s[i?1]s[i-1]s[i?1] 這個字符出現幾次來分,零次、一次或兩次及以上:
        • p[j?1]p[j-1]p[j?1] 匹配零個 sss 中字符,相當于刪掉 * 自己及其之前的一個字符,看能不能匹配成功,比如 ### 和 ###a* ,這時 dp[i][j]=dp[i][j?2]dp[i][j]=dp[i][j-2]dp[i][j]=dp[i][j?2]
        • p[j?1]p[j-1]p[j?1] 匹配一個 sss 中字符,相當于把 * 自己刪掉,看能不能匹配成功,比如 ### 和 ###*,這時 dp[i][j]=dp[i?1][j?2]dp[i][j]=dp[i-1][j-2]dp[i][j]=dp[i?1][j?2]
        • p[j?1]p[j-1]p[j?1] 匹配多個 sss 中字符,這時 dp[i][j]=dp[i?1][j]dp[i][j]=dp[i-1][j]dp[i][j]=dp[i?1][j]
        • 注意,以上三種情況只要滿足一種即可,是 的關系。
      • 如果未能匹配上,即 $p[j-2]\ne s[i-1] $ 且 p[j?2]≠′.′p[j-2]\ne '.'p[j?2]?=. ,這時 p[j?1]p[j-1]p[j?1] 的這個 * 可以把沒能匹配上的 p[j?2]p[j-2]p[j?2] 刪掉,因此就取決于再之前的子串是否匹配:dp[i][j]=dp[i][j?2]dp[i][j]=dp[i][j-2]dp[i][j]=dp[i][j?2]

初始化

首先 dp[0][0]dp[0][0]dp[0][0]sssppp 均為空時, 認為是可以匹配的,之后的 dp[0][j]dp[0][j]dp[0][j] 要先看 p[j?1]p[j-1]p[j?1] 是否為 * ,若為 * ,則 dp[0][j]=dp[0][j?2]dp[0][j]=dp[0][j-2]dp[0][j]=dp[0][j?2]

其他位置均初始化為 falsefalsefalse

遍歷順序

從前到后即可

class Solution {
public:bool isMatch(string s, string p) {int m = s.size(), n = p.size();vector<vector<bool>> dp(m+1, vector<bool> (n+1, false));dp[0][0] = true;for (int j=1; j<n+1; ++j) {if (p[j-1] == '*') dp[0][j] = dp[0][j-2];}for (int i=1; i<m+1; ++i) {for (int j=1; j<n+1; ++j) {if (s[i-1] == p[j-1] || p[j-1] == '.') dp[i][j] = dp[i-1][j-1];else if (p[j-1] == '*') {if (s[i-1] == p[j-2] || p[j-2] == '.') {dp[i][j] = dp[i][j-2] || dp[i-1][j-2] || dp[i-1][j];}else {dp[i][j] = dp[i][j-2];}}}}return dp[m][n];}
};

Ref:

https://leetcode.cn/problems/regular-expression-matching/solution/shou-hui-tu-jie-wo-tai-nan-liao-by-hyj8/

https://leetcode.cn/problems/regular-expression-matching/solution/dong-tai-gui-hua-zen-yao-cong-0kai-shi-si-kao-da-b/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532476.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

shell if判斷和for循環常見寫法

shell if判斷和for循環常見寫法 轉自&#xff1a; Shell中for循環的幾個常用寫法 Shell中if 條件判斷總結 if常見寫法 一、if的基本語法: if [ command ];then符合該條件執行的語句 elif [ command ];then符合該條件執行的語句 else符合該條件執行的語句 fibash shell會按順序…

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題 如果我們想要在 Pytorch 中同時迭代兩個 dataloader 來處理數據&#xff0c;會有兩種情況&#xff1a;一是我們按照較短的 dataloader 來迭代&#xff0c;長的 dataloader 超過的部分就丟棄掉…

neovim及coc.nvim自動補全初探

neovim及coc.nvim自動補全初探 安裝 # mac # 安裝 brew install neovim # 查看neovim安裝路徑 brew list nvim# ubuntu apt install neovim習慣了打開 vi/vim 的方式&#xff0c;可以用個 alias 在 ~/.zshrc 中設置一下&#xff1a; alias vi"nvim"插件 vim-plug…

sed 簡明教程

sed 簡明教程 轉自&#xff1a;https://coolshell.cn/articles/9104.html awk于1977年出生&#xff0c;今年36歲本命年&#xff0c;sed比awk大2-3歲&#xff0c;awk就像林妹妹&#xff0c;sed就是寶玉哥哥了。所以 林妹妹跳了個Topless&#xff0c;他的哥哥sed坐不住了&#xf…

awk 簡明教程

awk 簡明教程 轉自&#xff1a;https://coolshell.cn/articles/9070.html 有一些網友看了前兩天的《Linux下應該知道的技巧》希望我能教教他們用awk和sed&#xff0c;所以&#xff0c;出現了這篇文章。我估計這些80后的年輕朋友可能對awk/sed這類上古神器有點陌生了&#xff0c…

應該知道的LINUX技巧

應該知道的LINUX技巧 轉自&#xff1a;https://coolshell.cn/articles/8883.html 這篇文章來源于Quroa的一個問答《What are some time-saving tips that every Linux user should know?》—— Linux用戶有哪些應該知道的提高效率的技巧。我覺得挺好的&#xff0c;總結得比較好…

[深度][PyTorch] DDP系列第一篇:入門教程

[深度][PyTorch] DDP系列第一篇&#xff1a;入門教程 轉自&#xff1a;[原創][深度][PyTorch] DDP系列第一篇&#xff1a;入門教程 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:實現原理與源代碼解析

[深度][PyTorch] DDP系列第二篇&#xff1a;實現原理與源代碼解析 轉自&#xff1a;https://zhuanlan.zhihu.com/p/187610959 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:實戰與技巧

[深度][PyTorch] DDP系列第三篇&#xff1a;實戰與技巧 轉自&#xff1a;https://zhuanlan.zhihu.com/p/250471767 零. 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I do! – – …

PIL、OpenCV中resize算子實現不同的問題

PIL、OpenCV中resize算子實現不同的問題 測試圖像&#xff1a;https://raw.githubusercontent.com/TropComplique/ssd-pytorch/master/images/dogs-and-cats.jpg &#xff08;直接 wget 可獲得&#xff09; 測試版本&#xff1a; opencv-python 4.4.0.46Pillow 8.0.1 測試代…

mac X11 XQuartz的安裝與使用

mac X11 XQuartz的安裝與使用 本地系統&#xff1a;MacOS 12.4 遠程主機系統&#xff1a;Ubuntu 18.04 命令說明 ssh命令 ssh 命令大家很熟悉了&#xff0c;這里僅介紹與 X11 forwarding 相關的幾個選項。 本部分譯自 ssh 命令手冊&#xff0c;可見 man ssh -X &#xf…

機器學習:系統設計與實現 分布式訓練

機器學習系統:設計與實現 分布式訓練 轉自&#xff1a;https://openmlsys.github.io/chapter_distributed_training/index.html 隨著機器學習的進一步發展&#xff0c;科學家們設計出更大型&#xff0c;更多功能的機器學習模型&#xff08;例如說&#xff0c;GPT-3&#xff09;…

Linux命令行及各常用工具代理設置

Linux命令行及各常用工具代理設置 命令行代理設置 1 通過命令行指定 直接為當前命令行設置代理 對當前終端的全部工具&#xff08;apt、curl、wget、git 等全都有效&#xff09;以下僅以 http 代理為例&#xff0c;如果是其他協議&#xff08;如 socks 等&#xff09;自行改…

VimScript 五分鐘入門(翻譯)

VimScript 五分鐘入門&#xff08;翻譯&#xff09; 轉自&#xff1a;https://zhuanlan.zhihu.com/p/37352209 譯注&#xff1a;折騰 Vim 當然要能看懂和改寫相關腳本&#xff0c;而中文資料匱乏&#xff0c;缺一個提綱挈領的教程。本文翻譯自 Andrew Scala 的 《Five Minute V…

C++多線程推理、生產者消費者模式封裝

C多線程推理、生產者消費者模式封裝 tensorRT從零起步邁向高性能工業級部署&#xff08;就業導向&#xff09; 課程筆記&#xff0c;講師講的不錯&#xff0c;可以去看原視頻支持下。 深度學習推理中的多線程知識概覽 本章介紹的多線程主要是指算法部署時所涉及的多線程內容&a…

在Python中調用C/C++:cython及pybind11

在Python中調用C/C&#xff1a;cython及pybind11 轉自&#xff1a;https://zhuanlan.zhihu.com/p/442935082 Python寫起來非常方便, 但面對大量for循環的時候, 執行速度有些捉急. 原因在于, python是一種動態類型語言, 在運行期間才去做數據類型檢查, 這樣效率就很低(尤其是大規…

Pytorch導出onnx模型,C++轉化為TensorRT并實現推理過程

Pytorch導出onnx模型&#xff0c;C轉化為TensorRT并實現推理過程 前言 本文為旨在實現整個Python導出PyTorch模型&#xff0c;C轉化為TensorRT并實現推理過程過程&#xff0c;只與模型推理&#xff0c;模型部署相關&#xff0c;不涉及模型訓練。為突出整個部署過程而非具體模…

從零Makefile落地算法大項目,完整案例教程

從零Makefile落地算法大項目&#xff0c;完整案例教程 轉自&#xff1a;從零Makefile落地算法大項目&#xff0c;完整案例教程 作者&#xff1a;手寫AI 前言 在這里&#xff0c;你能學到基于Makefile的正式大項目的使用方式和考慮&#xff0c;相信我&#xff0c;其實可以很簡單…

PyTorch擴展自定義PyThonC++(CUDA)算子的若干方法總結

PyTorch擴展自定義PyThon/C(CUDA)算子的若干方法總結 轉自&#xff1a;https://zhuanlan.zhihu.com/p/158643792 作者&#xff1a;奔騰的黑貓 在做畢設的時候需要實現一個PyTorch原生代碼中沒有的并行算子&#xff0c;所以用到了這部分的知識&#xff0c;再不總結就要忘光了 &a…

給 Python 算法插上性能的翅膀——pybind11 落地實踐

給 Python 算法插上性能的翅膀——pybind11 落地實踐 轉自&#xff1a;https://zhuanlan.zhihu.com/p/444805518 作者&#xff1a;jesonxiang&#xff08;向乾彪&#xff09;&#xff0c;騰訊 TEG 后臺開發工程師 1. 背景 目前 AI 算法開發特別是訓練基本都以 Python 為主&…