自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

LeetCode之正則表達(dá)式匹配(Top 100)

開發(fā) 前端
已知一個(gè)字符串 s 和一個(gè)字符規(guī)律 p,請(qǐng)你來實(shí)現(xiàn)一個(gè)支持 '.' 和 '*' 的正則表達(dá)式匹配。所謂匹配,是要涵蓋 整個(gè) 字符串 s 的,而不是部分字符串。

[[438356]]

前言

本題為 LeetCode 前 100 高頻題

我們社區(qū)陸續(xù)會(huì)將顧毅(Netflix 增長黑客,《iOS 面試之道》作者,ACE 職業(yè)健身教練。微博:@故胤道長[1])的 Swift 算法題題解整理為文字版以方便大家學(xué)習(xí)與閱讀。

LeetCode 算法到目前我們已經(jīng)更新了 9 期,我們會(huì)保持更新時(shí)間和進(jìn)度(周一、周三、周五早上 9:00 發(fā)布),每期的內(nèi)容不多,我們希望大家可以在上班路上閱讀,長久積累會(huì)有很大提升。

不積跬步,無以至千里;不積小流,無以成江海,Swift社區(qū) 伴你前行。

難度水平:困難

1. 描述

已知一個(gè)字符串 s 和一個(gè)字符規(guī)律 p,請(qǐng)你來實(shí)現(xiàn)一個(gè)支持 '.' 和 '*' 的正則表達(dá)式匹配。

  • '.' 匹配任意單個(gè)字符
  • '*' 匹配零個(gè)或多個(gè)前面的那一個(gè)元素

所謂匹配,是要涵蓋 整個(gè) 字符串 s 的,而不是部分字符串。

2. 示例

示例 1

  1. 輸入:s = "aa" p = "a" 
  2. 輸出:false 
  3. 解釋:"a" 無法匹配 "aa" 整個(gè)字符串。 

示例 2

  1. 輸入:s = "aa" p = "a*" 
  2. 輸出:true 
  3. 解釋:因?yàn)?nbsp;'*' 代表可以匹配零個(gè)或多個(gè)前面的那一個(gè)元素, 在這里前面的元素就是 'a'。因此,字符串 "aa" 可被視為 'a' 重復(fù)了一次。 

示例 3

  1. 輸入:s = "ab" p = ".*" 
  2. 輸出:true 
  3. 解釋:".*" 表示可匹配零個(gè)或多個(gè)('*')任意字符('.')。 

示例 4

  1. 輸入:s = "aab" p = "c*a*b" 
  2. 輸出:true 
  3. 解釋:因?yàn)?nbsp;'*' 表示零個(gè)或多個(gè),這里 'c' 為 0 個(gè), 'a' 被重復(fù)一次。因此可以匹配字符串 "aab"。 

示例 5

  1. 輸入:s = "mississippi" p = "mis*is*p*." 
  2. 輸出:false 

約束條件:

  • 1 <= s.length <= 20
  • 1 <= p.length <= 30
  • s 可能為空,且只包含從 a-z 的小寫字母。
  • p 可能為空,且只包含從 a-z 的小寫字母,以及字符 . 和 *。
  • 保證每次出現(xiàn)字符 * 時(shí),前面都匹配到有效的字符

3. 答案

  1. class RegularExpressionMatching { 
  2.     func isMatch(_ s: String, _ p: String) -> Bool { 
  3.         let sChars = Array(s), pChars = Array(p) 
  4.         var dp = Array(repeating: Array(repeating: falsecount: pChars.count + 1), count: sChars.count + 1) 
  5.         dp[0][0] = true 
  6.          
  7.         for i in 0...pChars.count { 
  8.          // jump over "" vs. "x*" case 
  9.             dp[0][i] = i == 0 || i > 1 && dp[0][i - 2] && pChars[i - 1] == "*" 
  10.         } 
  11.          
  12.         for i in 0...sChars.count { 
  13.             for j in 0...pChars.count { 
  14.                 guard j > 0 else { 
  15.                     continue 
  16.                 } 
  17.                  
  18.                 let pCurrent = pChars[j - 1] 
  19.                  
  20.                 if pCurrent != "*" { 
  21.                     dp[i][j] = i > 0 && dp[i - 1][j - 1] && (pCurrent == "." || pCurrent == sChars[i - 1]) 
  22.                 } else { 
  23.                     dp[i][j] = dp[i][j - 2] || i > 0 && j > 1 && (sChars[i - 1] == pChars[j - 2] || pChars[j - 2] == ".") && dp[i - 1][j] 
  24.                 } 
  25.             } 
  26.         } 
  27.          
  28.         return dp[sChars.count][pChars.count
  29.     } 
  • 主要思想:經(jīng)典二維動(dòng)態(tài)規(guī)劃
  • 時(shí)間復(fù)雜度: O(mn)
  • 空間復(fù)雜度: O(mn)

該算法題解的倉庫:LeetCode-Swift[2]

前往 LeetCode[3] 練習(xí)

參考資料

[1]@故胤道長: https://m.weibo.cn/u/1827884772

[2]LeetCode-Swift: https://github.com/soapyigu/LeetCode-Swift

[3]LeetCode: https://leetcode.com/problems/regular-expression-matching

 

責(zé)任編輯:姜華 來源: Swift社區(qū)
相關(guān)推薦

2009-08-20 14:26:51

C#正則表達(dá)式

2009-09-16 16:22:04

正則表達(dá)式匹配

2017-05-12 10:47:45

Linux正則表達(dá)式程序基礎(chǔ)

2012-04-28 15:22:46

PHP

2009-09-16 18:08:14

正則表達(dá)式匹配單詞

2009-06-08 16:49:05

Java正則表達(dá)式group

2018-09-27 15:25:08

正則表達(dá)式前端

2009-09-16 13:24:30

PHP正則表達(dá)式匹配

2009-09-16 16:48:03

正則表達(dá)式匹配數(shù)字

2020-09-04 09:16:04

Python正則表達(dá)式虛擬機(jī)

2010-03-04 15:20:20

Ubuntu Patt

2010-03-15 16:21:28

Python正則表達(dá)式

2009-08-20 13:38:58

C#正則表達(dá)式

2024-09-14 09:18:14

Python正則表達(dá)式

2010-03-10 18:57:53

Python正則表達(dá)式

2009-09-16 17:02:15

正則表達(dá)式匹配字符串

2009-09-16 13:53:17

PHP正則表達(dá)式匹配

2009-09-16 17:38:49

正則表達(dá)式匹配任意字符

2010-07-21 10:43:25

Perl正則表達(dá)式匹配

2009-06-10 13:51:25

Java正則表達(dá)式匹配替換
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)