国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LeetCode熱題100】打卡第6天:正則表達式匹配

這篇具有很好參考價值的文章主要介紹了【LeetCode熱題100】打卡第6天:正則表達式匹配。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

正則表達式匹配

?前言

大家好,我是知識汲取者,歡迎來到我的LeetCode熱題100刷題專欄!

精選 100 道力扣(LeetCode)上最熱門的題目,適合初識算法與數(shù)據(jù)結構的新手和想要在短時間內高效提升的人,熟練掌握這 100 道題,你就已經(jīng)具備了在代碼世界通行的基本能力。在此專欄中,我們將會涵蓋各種類型的算法題目,包括但不限于數(shù)組、鏈表、樹、字典樹、圖、排序、搜索、動態(tài)規(guī)劃等等,并會提供詳細的解題思路以及Java代碼實現(xiàn)。如果你也想刷題,不斷提升自己,就請加入我們吧!QQ群號:827302436。我們共同監(jiān)督打卡,一起學習,一起進步。

博客主頁??:知識汲取者的博客

LeetCode熱題100專欄??:LeetCode熱題100

Gitee地址??:知識汲取者 (aghp) - Gitee.com

Github地址??:Chinafrfq · GitHub

題目來源??:LeetCode 熱題 100 - 學習計劃 - 力扣(LeetCode)全球極客摯愛的技術成長平臺

PS:作者水平有限,如有錯誤或描述不當?shù)牡胤剑瑧┱埣皶r告訴作者,作者將不勝感激

??題目

原題鏈接:10. 正則表達式匹配 - 力扣(LeetCode)

【LeetCode熱題100】打卡第6天:正則表達式匹配

??題解

  • 解法一:正則表達式

    這里標記是困難,但是如果使用正則表達式一行代碼就解決了,但是這題的作者可能并不是想要我們使用正則表達式,而是使用動態(tài)規(guī)劃,如果使用動態(tài)規(guī)劃這題難度直接上升幾個等級。所以大家不要為了做題而做題,而是去學習了解更多的算法思路,有時候我們不需要去把一個題給AC了,而是要做到,看到一個題能夠第一時間直到這題考察的內容,應該使用哪種算法策略,畢竟現(xiàn)在AI這么流行,直接把一個題交給AI,他立馬能夠給你解答。

    當然這題使用正則也不賴,也是一種比較優(yōu)秀的解法,但是卻無法鍛煉到我們的邏輯思維,因為太簡單了??正則表達式YYDS

    import java.util.regex.Pattern;
    
    class Solution {
        public boolean isMatch(String s, String p) {
            return Pattern.matches(p, s);
        }
    }
    

    復雜度分析:

    • 時間復雜度: O ( n ) O(n) O(n),正則匹配本質是
    • 空間復雜度: O ( 1 ) O(1) O(1)

    其中 n n n 為字符串的長度

  • 解法二:動態(tài)規(guī)劃

    本段代碼來自這位大佬的:fomalhaut1998 - 力扣(LeetCode)

    class Solution {
        public boolean isMatch(String s, String p) {
            /*
            dp五部曲:
            設主串s的長度為m,設模式串p的長度為n;其中s只有小寫字母,p有字母/./*
            1.狀態(tài)定義:dp[i][j]為考慮s[0,i-1]與p[0,j-1]是否能匹配上,能匹配上就為true
            2.狀態(tài)轉移:若要求dp[i][j]就必須考慮到s[i-1]與p[j-1]
                2.1 當p[j-1]不是'*'時
                    2.1.1 若s[i-1]==p[j-1]時,即p[j-1]為'a'-'z'且與s[i-1]相等,看dp[i-1][j-1]
                    2.1.2 p[j-1] == '.'時,直接將'.'變成s[i-1],看dp[i-1][j-1]
                    注意:這里的'.'是匹配一個字符,而不是一連串,如"a.b"->"axb"
                2.2 當p[j-1]是'*'時,主要看p[j-2]做判斷
                    2.2.1 p[j-2]為'a'-'z'并且p[j-2]==s[i-1],那么此時s繼續(xù)往前看,p暫時不動
                        即:看dp[i-1][j]
                    2.2.2 p[j-2]為'.',那么".*"可以變?yōu)?....."可以匹配s[i-1]前面的任何字符(萬能串)
                        因此,直接看dp[i-1][j](或者直接返回true)
                    2.2.3 剩下的就是p[j-2]為'a'-'z'且p[j-2]!=s[i-1],那么此時p的"x*"作廢,看dp[i][j-2]
                這里:2.1.1與2.2.2可以看成一種情形:即s與p均前移一位
                    2.2.1與2.2.2可以看成一種情形:即p不動s前移一位
            3.初始化:
                3.1 空的s
                    3.1.1 空的p,空的s可以匹配空的p,因此dp[0][0]=true
                    3.1.2 非空的p,空的s可能可以匹配非空的p,例如"a*",因此需要經(jīng)過轉移計算
                3.2 空的p
                    3.2.1 空的s,同3.1.1
                    3.2.2 非空的s,空的p不可能匹配非空的s,因此dp[i][0]=false,i∈[1,m]
                3.3 非空的s與非空的p:需要經(jīng)過轉移計算
                其中:3.1.1與3.2.2可以合并為dp[i][0]=i==0
            4.遍歷順序:顯然是正序遍歷
            5.返回形式:返回dp[m][n]就是考慮s[0,m-1]與p[0,n-1]是否能匹配上
            */
            int m = s.length(), n = p.length();
            boolean[][] dp = new boolean[m + 1][n + 1];
            // 初始化dp[i][0]
            // for(int i = 0; i <= m; i++) {
            //     dp[i][0] = i == 0;
            // }
            dp[0][0] = true;
            // i從0開始
            for(int i = 0; i <= m; i++) {
                // 注意j從1開始
                for(int j = 1; j <= n; j++) {
                    if(p.charAt(j - 1) != '*') {
                        // 1.當p[j-1]不是'*'時(注意j已經(jīng)從1開始了)
                        // 這里要注意運算優(yōu)先級問題(加括號)
                        if(i >= 1 && (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '.')) {
                            // s與p均前移一位
                            dp[i][j] = dp[i - 1][j - 1];
                        }
                    } else {
                        // 2.當p[j-1]是'*'時,主要看p[j-2]做判斷
                        if(j >= 2 && i >= 1 && 
                        (p.charAt(j - 2) == s.charAt(i - 1) || p.charAt(j - 2) == '.')) {
                            // 看"x*":p不動s前移一位
                            dp[i][j] = dp[i - 1][j];
                        }
                        // 不看"x*":
                        // 剩下的為p[j-2]為'a'-'z'且p[j-2]!=s[i-1],那么此時p的"x*"作廢,看dp[i][j-2]
                        if(j >= 2) {
                            dp[i][j] |= dp[i][j - 2];
                        }
                        // 這里的|=表示只要滿足了其中一個條件就可以使得dp[i][j]==true
                        // 通俗一點的解釋就是:當p[j-1]=='*'時,
                        // 若p[j-2]==s[i-1]||p[j-2]=='.',則dp[i][j]可以繼承dp[i-1][j]:轉移路徑1
                        // 若p[j-2]!=s[i-1],則dp[i][j]可以繼承dp[i][j-2]:轉移路徑2
                        // 滿足任意一條轉移路徑就可以使得dp[i][j]=true
                    }        
                }
            }
            // 所求即為考慮s[0,m-1]與p[0,n-1]是否能匹配上
            return dp[m][n];
        }
    }
    

    詳情參考官方代碼

    復雜度分析:

    • 時間復雜度: O ( n ? m ) O(n*m) O(n?m)
    • 空間復雜度: O ( n ? m ) O(n*m) O(n?m)

    其中 n n n 為數(shù)組中元素的個數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-462752.html

到了這里,關于【LeetCode熱題100】打卡第6天:正則表達式匹配的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【正則表達式】正則表達式常見匹配模式

    模式 描述 w 匹配字母數(shù)字及下劃線 W 匹配非字母數(shù)字下劃線 s 匹配任意空白字符,等價于 [tnrf]. S 匹配任意非空字符 d 匹配任意數(shù)字,等價于 [0-9] D 匹配任意非數(shù)字 A 匹配字符串開始 Z 匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串 z 匹配字符串結

    2024年02月09日
    瀏覽(41)
  • 正則表達式 (用于靈活匹配文本的表達式)

    目錄 . * 用于匹配任意單個字符,除了換行符。 例如使用正則表達式 a.b, 它可以匹配aab、acb、a#b 用于匹配前一個字符零次或多次。 例如,使用正則表達式 ab*c ,它可以匹配 \\\"ac\\\"、\\\"abc\\\"、\\\"abbc\\\",因為 b* 表示匹配零個或多個字符 \\\"b\\\"。所以,這個表達式可以匹配 \\\"ac\\\"(零個 \\\"b\\\"),

    2024年01月16日
    瀏覽(33)
  • Java 正則表達式匹配

    正則表達式: 定義一個搜索模式的字符串。 正則表達式可以用于搜索、編輯和操作文本。 正則對文本的分析或修改過程為:首先正則表達式應用的是文本字符串(text/string),它會以定義的模式從左到右匹配文本,每個源字符只匹配一次。 正則表達式 匹配 this is text 精確匹配

    2024年02月06日
    瀏覽(29)
  • 正則表達式的神奇世界:表達、匹配和提取

    正則表達式,這個看起來像密林中的迷宮的工具,既神秘又令人著迷。它是編程世界中的一門魔法,有著神奇的能力。你是否曾經(jīng)在尋找或解析文本時感到束手無策?或許你想要從海量數(shù)據(jù)中提取特定信息?這正是正則表達式可以派上用場的時候。本文將帶你探索這個神奇的

    2024年02月07日
    瀏覽(35)
  • VSCode 正則表達式 匹配多行

    VSCode 正則表達式 匹配多行

    VS Code 正則表達式匹配多行 (.|n)*? 案例1: str(.|n)*?, 案例2: const(.|n)*?}$ 案例3: fn(.|n)*?},

    2024年02月02日
    瀏覽(21)
  • 【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配

    【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配

    題目描述: 給你一個輸入字符串 (s) 和一個字符模式 § ,請你實現(xiàn)一個支持 ‘?’ 和 ‘*’ 匹配規(guī)則的通配符匹配: ‘?’ 可以匹配任何單個字符。 ‘*’ 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要條件是:字符模式必須能夠 完全匹配 輸入字符串(而

    2024年02月07日
    瀏覽(36)
  • 詳解正則表達式匹配方法 match()

    詳解正則表達式匹配方法 match()

    在前端開發(fā)中,正則表達式是一大利器。所以我們這次就來討論下match()方法。 match本身是JavaScript語言中字符串對象的一個方法,該方法的簽名是 match([string] | [RegExp]) 它的參數(shù)既可以是一個字符串,也可以是一個正則表達式。該方法絕大多數(shù)都是要使用正則表達式的,所以參

    2024年02月11日
    瀏覽(19)
  • 正則表達式的匹配(py編程)

    1. 匹配單個字符 在上一小節(jié)中,了解到通過re模塊能夠完成使用正則表達式來匹配字符串 本小節(jié),將要講解正則表達式的單字符匹配 代碼 功能 . 匹配任意1個字符(除了n) [ ] 匹配[ ]中列舉的字符 d 匹配數(shù)字,即0-9 D 匹配非數(shù)字,即不是數(shù)字 s 匹配空白,即 空格,tab鍵

    2024年02月02日
    瀏覽(23)
  • 劍指 Offer 19. 正則表達式匹配

    劍指 Offer 19. 正則表達式匹配 初始化要考慮主串為空字符串,模式串為 a*b*c* 的形式。 一般情況時,根據(jù)模式串是 普通字符 、 \\\'.\\\' 、 \\\'*\\\' 分情況考慮。為 \\\'*\\\' 時,考慮 匹配0次 和 匹配多次 的情況,匹配多次時要注意判斷前提是能匹配。

    2024年02月09日
    瀏覽(25)
  • 正則表達式包含數(shù)字和字符匹配

    正則表達式包含數(shù)字和字符匹配

    至少6位。 pattern : (?=. [0-9])(?=. [A-Za-z])[0-9A-Za-z]{6,} 正則表達式中的“?=”是一個正向預查字符,它的意思是匹配前一個字符出現(xiàn)的最少一次。具體來說,當一個匹配出現(xiàn)時,它會檢查前一個字符是否符合要求,如果符合,則繼續(xù)匹配下一個字符,否則停止匹配。

    2024年02月06日
    瀏覽(35)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包