成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
已知一個字符串 s 和一個字符規律 p,請你來實現一個支持 '.' 和 '*' 的正則表達式匹配。所謂匹配,是要涵蓋 整個 字符串 s 的,而不是部分字符串。

[[438356]]

前言

本題為 LeetCode 前 100 高頻題

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

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

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

難度水平:困難

1. 描述

已知一個字符串 s 和一個字符規律 p,請你來實現一個支持 '.' 和 '*' 的正則表達式匹配。

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

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

2. 示例

示例 1

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

示例 2

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

示例 3

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

示例 4

  1. 輸入:s = "aab" p = "c*a*b" 
  2. 輸出:true 
  3. 解釋:因為 '*' 表示零個或多個,這里 'c' 為 0 個, 'a' 被重復一次。因此可以匹配字符串 "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 的小寫字母,以及字符 . 和 *。
  • 保證每次出現字符 * 時,前面都匹配到有效的字符

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.     } 
  • 主要思想:經典二維動態規劃
  • 時間復雜度: O(mn)
  • 空間復雜度: O(mn)

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

前往 LeetCode[3] 練習

參考資料

[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

 

責任編輯:姜華 來源: Swift社區
相關推薦

2009-08-20 14:26:51

C#正則表達式

2017-05-12 10:47:45

Linux正則表達式程序基礎

2009-09-16 16:22:04

正則表達式匹配

2012-04-28 15:22:46

PHP

2009-09-16 18:08:14

正則表達式匹配單詞

2009-06-08 16:49:05

Java正則表達式group

2018-09-27 15:25:08

正則表達式前端

2020-09-04 09:16:04

Python正則表達式虛擬機

2009-09-16 13:24:30

PHP正則表達式匹配

2009-09-16 16:48:03

正則表達式匹配數字

2010-03-04 15:20:20

Ubuntu Patt

2010-03-15 16:21:28

Python正則表達式

2024-09-14 09:18:14

Python正則表達式

2009-08-20 13:38:58

C#正則表達式

2010-03-25 18:25:36

Python正則表達式

2022-03-28 06:19:14

正則表達式開發

2021-01-27 11:34:19

Python正則表達式字符串

2009-02-18 09:48:20

正則表達式Java教程

2019-07-17 15:45:47

正則表達式字符串前端

2009-09-16 18:19:34

正則表達式組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91看片在线观看 | 夜夜摸夜夜操 | 日本黄色大片免费看 | 欧美精品一二区 | 自拍偷拍3p | 国产十日韩十欧美 | 精品成人在线观看 | 久久久爽爽爽美女图片 | 成人欧美一区二区三区黑人孕妇 | 东京av男人的天堂 | 欧美一级片免费看 | 精品日韩一区 | 久久久久久国产精品 | 日韩欧美中文字幕在线观看 | 九九视频网 | 亚洲一区视频 | 亚洲免费在线观看 | www亚洲免费国内精品 | 久久国产三级 | 99在线免费观看 | 日日摸日日碰夜夜爽2015电影 | 最近中文字幕第一页 | 日本在线你懂的 | 成人精品视频 | 国产一级免费视频 | 九九综合九九 | 国产精品久久久久久久久图文区 | 性高湖久久久久久久久aaaaa | 亚洲欧洲视频 | 日韩一区二区三区精品 | 色爱综合网 | 久久专区 | 玖玖精品 | 日韩精品 | 亚洲综合婷婷 | 羞羞视频在线网站观看 | 日韩2020狼一二三 | 国产1区2区3区 | 欧美日韩国产欧美 | 91欧美激情一区二区三区成人 | 天天久久 |