leetcode10正則表達式匹配

leetcode10正則表達式匹配

  • 思路
  • python

思路

難點1
如何理解特殊字符 ’ * ’ 的作用?
如何正確的利用特殊字符 ’ . ’ 和 ’ * ’ ?

'*' 匹配零個或多個前面的那一個元素
"a*" 可表示的字符為不同數目的 'a',包括:
""(0 個 'a')
"a"(1 個 'a')
"aa"(2 個 'a')
"aaa"(3 個 'a')

難點2
正則表達式匹配:一種在文本中查找特定模式的方法。
這道題的正則匹配規則主要是 ’ * '、 ’ . ’ 這兩個特殊字符的使用。

如何利用現有數據結構 構造這個問題?
按照規則,(有順序)從左到右來匹配一個字符串。
所謂匹配,是要涵蓋 整個 字符串 s的,而不是部分字符串。

如果不考慮這兩個特殊字符,我們可以用二維數組來動態的表示兩個字符串是否匹配。只有前面的數組匹配上,后面的數組才可以繼續匹配。
在這里插入圖片描述
但現在要考慮 ’ * '、 ’ . ’ 這兩個特殊字符。
p[j]= ‘.’,則 p[j]一定可以與 s[i]匹配成功,此時有dp[i][j]=dp[i?1][j?1]
p[j]= ‘*’,則表示可對 p[j]的前一個字符 p[j?1]匹配(或理解為復制)任意次(包括 0 次)。
在這里插入圖片描述

匹配0次,意味著 p[j?1]和 p[j]不起作用,
相當于在 p 中刪去了 p[j?1]和 p[j],
此時有:dp[i][j]=dp[i][j?2]

匹配 1次,意味著 p[j?1]和 p[j]組成了 1 個’a’,若 s[i?1+1, …, i]=p[j?1],
則 dp[i][j]可由 dp[i?1][j?2]轉移而來,
此時有:dp[i][j]=dp[i?1][j?2],&s[i?1+1, …, i]=p[j?1]

匹配 k 次,意味著 p[j?1]和 p[j]組成了 k 個’a’,若 s[i?k+1, …, i]=p[j?1],
則 dp[i][j]可由 dp[i?k][j?2]轉移而來,
此時有:dp[i][j]=dp[i?k][j?2],&s[i?k+1, …, i]=p[j?1]

在這里插入圖片描述
難點3
狀態轉移的優化
總的來看,當 p[j]= '’ 時,對于匹配 0~k次,我們有:
在這里插入圖片描述
同時,對于 dp[i?1][j]我們有:
在這里插入圖片描述
觀察發現,(2)式與(1)式中的后 k 項剛好相差了一個條件 s[i]=p[j?1],將(2)式代入(1)式可得簡化后的「狀態轉移方程」為:
p[j]= '
'時,簡化后對應的狀態更新過程如下圖所示:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

記 s 的長度為 m,p的長度為 n 。為便于狀態更新,減少對邊界的判斷,初始二維 dpdpdp 數組維度為 (m+1)×(n+1),其中第一行和第一列的狀態分別表示字符串 s 和 p 為空時的情況。

顯然,dp[0][0]=True。對于其他 dp[0][j],當 p[j]≠p[j]='‘時,s[0,…,j]無法與空字符匹配,因此有 dp[0][j]=False;而當 p[j]=p[j]=p[j]=’'時,則有 dp[0][j]=dp[0][j?2]。

python

class Solution:def isMatch(self, s: str, p: str) -> bool:m, n = len(s), len(p)dp = [[False] * (n+1) for _ in range(m+1)]# 初始化dp[0][0] = Truefor j in range(1, n+1):if p[j-1] == '*':dp[0][j] = dp[0][j-2]# 狀態更新for i in range(1, m+1):for j in range(1, n+1):if s[i-1] == p[j-1] or p[j-1] == '.':dp[i][j] = dp[i-1][j-1]elif p[j-1] == '*':     # 【題目保證'*'號不會是第一個字符,所以此處有j>=2if s[i-1] != p[j-2] and p[j-2] != '.':dp[i][j] = dp[i][j-2]else:dp[i][j] = dp[i][j-2] | dp[i-1][j]return dp[m][n]

在這里插入圖片描述

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

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

相關文章

【大廠AI課學習筆記NO.65】機器學習框架和深度學習框架

筆記思維腦圖已上傳,訪問我的主頁可下載。 https://download.csdn.net/download/giszz/88868909 廣義上,機器學習框架包含了深度學習框架。 本質上,機器學習框架涵蓋分類、回歸、聚類、異常檢測和數據準備等各種學習方法。 深度學習框架涵…

Android PMS——權限控制分析(十二)

PMS 中的權限控制通過權限管理和權限請求兩個方面來實現。應用在 Android 系統中需要聲明和請求權限,PMS 則會根據應用聲明的權限和用戶的選擇來進行權限的管理和控制。 一、主要函數 1、Settings 源碼位置:/frameworks/base/services/core/java/com/android/server/pm/Se…

SpringBoot啟動擴展應用:干預優化+加快啟動時間

一、SpringBoot啟動配置原理簡述 本內容直接查看分析SpringBoot啟動配置原理,傳送門: 二、SpringBoot啟動過程干預 Spring Boot啟動過程中我們可以實現以下干預工作: 修改Spring Boot默認的配置屬性。使用ConfigurationProperties和Enable…

python celery beat實現定時任務

在Celery在python中的應用除了實現異步任務(async task)外也可以執行定時任務(beat) 1.Celery定時任務是什么? Celery默認任務單元由任務生產者觸發,但有時可能需要其自動觸發, 而beat進程正是負責此類任務,能夠自動觸發定時/周期性任務. 只需要在配置…

吳恩達deeplearning.ai:學習曲線決定下一步怎么做

以下內容有任何不理解可以翻看我之前的博客哦:吳恩達deeplearning.ai專欄 學習曲線是一種圖形表示方法,用于展示模型在訓練過程中的學習表現,即模型的訓練集和驗證集上的性能如何隨著訓練時間的增加而變化。可以幫助我們了解模型的學習進度。…

Orbit 使用指南 01| 創建空白場景 | Isaac Sim | Omniverse

如是我聞: 在使用指南01中 演示如何使用獨立的Python腳本啟動和控制Isaac Sim模擬器。介紹Orbit框架中兩個最常用的類app.AppLauncher和sim.SimulationContext。實踐在Oribit中設置一個空場景 代碼 本指南對應于orbit/source/standalone/tutorials/00_sim目錄中的…

制作耳機殼的UV樹脂和塑料材質哪一個成本更高一些?

總體來說,制作耳機殼的UV樹脂的成本可能會略高于塑料材質。 原材料成本:UV樹脂通常是通過復雜的合成過程制成的。這些過程不僅需要大量的能源投入,還需要較高水平的技術和設備支持,因此原材料成本較高。相比之下,塑料…

04-prometheus服務的動態發現

一、概述 目前,我們每增加一個被監控的節點,就需要修改prometheus的配置文件,然后重新加載prometheus服務,這種方式比較繁瑣,每次新增、刪除被監控節點都需要重新操作一遍,不適合生產環境的大規模監控架構&…

Go-zero中分布式事務的實現(DTM分布式事務管理器,在一個APi中如何調用兩個不同服務的rpc層,并保證兩個不同服務之間的業務邏輯同時成功)

涉及到的相關技術 1.DTM分布式事務管理器,解決跨數據庫、跨服務、跨語言棧更新數據的一致性問題。 2.SAGA事務模式,SAGA事務模式是DTM中常用的一種模式,簡單易上手.(當然還有其它更多的事務模式,這里采用的SAGA只不過是其中一種較為簡單的方法) 3.Go-zero框架,ETCD服務注冊... …

Windows 2012 設置 nginx 開機自啟動(適用于windows2012/10)

Windows 2012 設置 nginx 開機自啟動(適用于windows2012/10)https://www.cnblogs.com/xuegqcto/articles/7521483.html 在windows server 2012上安裝nginx,同時配置開機自啟動服務(推薦使用“Windows Service Wrapper”工具&…

leetcode 740.刪除并活得點數

這道題和打家劫舍得思路很像。 思路:首先我們看到題目的意思,就是說我們如果選擇了一個數,那么它相鄰的數就會不得選入,也就是刪除。這就是上一個題那個相鄰的家不能偷的問題唄! 我們從那個地方轉換一下,…

【Linux】線程概念|線程理解|線程控制

文章目錄 線程概念Linux中線程是否存在的討論線程創建和線程控制線程的終止和等待(三種終止方式 pthread_join()的void**retval) 線程概念 線程就是進程內部的一個執行流,線程在進程內運行,線程在進程的地址空間內運行&#xff0…

LeetCode-第14題-最長公共前綴

1.題目描述 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴,返回空字符串 ""。 2.樣例描述 3.思路描述 按字符串數組每個數組的長度,將字符串數組從小到大排序;他們的公共前綴一定小于或等于最長元素長度…

(Aliyun AI ACP 06)視覺智能基礎知識:視覺智能常用模型與算法

文章目錄 阿里云人工智能工程師ACP認證考試知識點輔助閱讀(Aliyun AI ACP 06)視覺智能基礎知識:視覺智能常用模型與算法視覺智能建模流程圖像預處理技術圖像特征提取算法深度學習模型 阿里云人工智能工程師ACP認證考試知識點輔助閱讀 &#…

2024年智能駕駛年度策略:自動駕駛開始由創造型行業轉向工程型行業

感知模塊技術路徑已趨于收斂,自動駕駛從創造型行業邁向工程型行業。在特斯拉的引領下,國內主機廠2022年以來紛紛跟隨特斯拉相繼提出“重感知、輕地圖”技術方案,全球自動駕駛行業感知模塊技術路徑從百花齊放開始走向收斂。我們認為主機廠智能…

2023.3.3周報

目錄 摘要 一、文獻閱讀 1、題目 2、摘要 3、模型架構 4、文獻解讀 一、Introduction 二、實驗 三、結論 二、PINN 一、PINN比傳統數值方法有哪些優勢 二、PINN方法 三、正問題與反問題 三、PINN實驗 一、數學方程 二、模型搭建 總結 摘要 本周我閱讀了一篇…

Postman上傳文件的操作方法

前言 調用某個接口,測試上傳文件功能。一時間不知如何上傳文件,本文做個操作記錄,期望與你有益。 步驟一、設置Headers key:Content-Type value:multipart/form-data 步驟二、設置Body 選擇form-data key:file下拉框選擇file類型value&…

STM32(8)NVIC編程

中斷源由部分片上外設產生 在misc.h中找,雜項 配置NVIC GPIO和AFIO不能產生中斷源,但能通過EXTI,由EXTI產生中斷源 NVIC不需要開啟時鐘,因為NVIC模塊位于內核內部,芯片一上電就能工作。 中斷響應函數 中斷向量表在啟…

Java:JVM基礎

文章目錄 參考JVM內存區域程序計數器虛擬機棧本地方法棧堆方法區符號引用與直接引用運行時常量池字符串常量池直接內存 參考 JavaGuide JVM內存區域 程序計數器 程序計數器是一塊較小的內存空間,可以看做是當前線程所執行的字節碼的行號指示器,各線程…

Unity 常用的4種燈光、制作鏡子、燈光的調用修改數值、

創建燈光時,一般用4種:定向光、點光源、聚光、區域光、 定向光:太陽 點光源:燈泡 聚光燈:手電筒 區域光:烘焙-貼圖 燈光選擇已烘焙 需要先選擇被烘焙的物體,然后再選擇Contribute GI 等待進…