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

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

這篇具有很好參考價值的文章主要介紹了【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、通配符匹配

題目描述:

給你一個輸入字符串 (s) 和一個字符模式 § ,請你實現(xiàn)一個支持 ‘?’ 和 ‘*’ 匹配規(guī)則的通配符匹配:

  • ‘?’ 可以匹配任何單個字符。
  • ‘*’ 可以匹配任意字符序列(包括空字符序列)。
    判定匹配成功的充要條件是:字符模式必須能夠 完全匹配 輸入字符串(而不是部分匹配)。

示例 1:

輸入:s = “aa”, p = “a”
輸出:false
解釋:“a” 無法匹配 “aa” 整個字符串。

示例 2:

輸入:s = “aa”, p = ""
輸出:true
解釋:'
’ 可以匹配任意字符串。

示例 3:

輸入:s = “cb”, p = “?a”
輸出:false
解釋:‘?’ 可以匹配 ‘c’, 但第二個 ‘a’ 無法匹配 ‘b’。

1.1 思路分析

我們可以分別以i和j表示s[0~i]p[0~j]是否能成功匹配。
【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配
那么這里就只用討論ij的位置,有四種情況
1?? 如果s[i] == p[j],那么我們就只用判斷dp[i - 1][j - 1]是否能成功匹配,如果能成功匹配,那么說明加上ij的位置也能成功匹配。
狀態(tài)轉移方程:dp[i][j] = s[i] == p[j] && dp[i - 1][j - 1]
2?? 如果p[j] == '?'那么說明此時s[i]不管是什么都可以,只需要判斷dp[i - 1][j - 1]是否能成功匹配,就跟上面一樣。
狀態(tài)轉移方程:dp[i][j] = p[j] == '?' && dp[i - 1][j - 1]
3?? 如果p[j] == '*',這里的情況就比較多,因為它可以變成0個或多個字符:
【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配
這么多情況只要有一種情況滿足條件即可。

狀態(tài)轉移方程:

for(int k = 0; k <= i; k++)
{
    if(dp[i - k][j - 1])
    {
        dp[i][j] = true;
        break;
    }
}

4?? 如果p[j] != '?' && p[j] != '*' && p[j] != s[i],那么說明不能匹配。

1.2 初始化處理

我們看到狀態(tài)轉移方程會用到i-1j- 1,所以dp表可以多開一維,而為了不改變下標的映射關系,我們可以在s串和p串的開頭各自添加一個字符。
接下來就是初始化,首先dp[0][0]就代表兩個空串,一定能匹配。所以dp[0][0] = true;
其次還有*在p串開頭的位置出現(xiàn),因為*可以變成空串,所以只要是開頭的*都可以跟s[0]匹配成功:dp[0][j] = true;

1.3 代碼

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

1.4 優(yōu)化

p[j] == '*'這種情況其實可以寫成:
【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配
而經過觀察可以再寫出一個式子:
【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配
經過觀察可以發(fā)現(xiàn)藍色框框圈起來的部分是相等的
【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配

所以可以寫成:
【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配

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

二、正則表達式匹配

題目描述:

給你一個字符串 s 和一個字符規(guī)律 p,請你來實現(xiàn)一個支持 ‘.’ 和 ‘*’ 的正則表達式匹配。

  • ‘.’ 匹配任意單個字符
  • ‘*’ 匹配零個或多個前面的那一個元素
    所謂匹配,是要涵蓋 整個 字符串 s的,而不是部分字符串。

示例 1:

輸入:s = “aa”, p = “a”
輸出:false
解釋:“a” 無法匹配 “aa” 整個字符串。

示例 2:

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

示例 3:

輸入:s = “ab”, p = “."
輸出:true
解釋:".
” 表示可匹配零個或多個(‘*’)任意字符(‘.’)。

這里的.字符跟上面一道題的?作用是一樣的。但是*字符又區(qū)別,它的作用是把*字符的前一個字符重復0次或者多次,比方說"a*"
它可以變成:"","a","aa","aaa"……

2.1 思路分析

這里的有些情況跟上面的重復:
dp[i - 1][j - 1] && (p[j] == '.' || s[i] == p[j])的時候,dp[i][j]=true。
接下來只剩p[j] == '*' 的情況:
這里要分情況討論j的前一個元素,如果前一個元素是.,那么也就是可以變成任意的多個字符,既然要匹配多個字符,那么又是跟上面一個題一樣要討論到底變成多長。因為上面講過優(yōu)化版,所以這里直接寫:
【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配

接下來如果前面一個字符是普通字符:
【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配
這里解釋以下:空自然不用說,當只變成長度為1的字符串時,首先要判斷j的前一個字符是否等于s[i],如果不相等就不用考慮前面的了。

2.2 初始化設置

還是跟上面一樣多加一維,然后讓dp[0][0] = true,接下來就是看p的前面全部是x*x*……這種字符串的情況:文章來源地址http://www.zghlxwxcb.cn/news/detail-470521.html

for(int j = 2; j < m; j += 2)
{
    if(p[j] == '*') dp[0][j] = true;
    else break;
}

2.3 代碼

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

到了這里,關于【動態(tài)規(guī)劃】通配符匹配與正則表達式匹配的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

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

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

相關文章

  • Shell腳本攻略:通配符、正則表達式

    Shell腳本攻略:通配符、正則表達式

    目錄 一、理論 1.通配符 2.正則表達式 二、實驗 1.通配符 2.正則表達式 (1)概念 通配符只用于匹配文件名、目錄名等,不能用于匹配文件內容,而且是已存在的文件或者目錄。 各個版本的shell都有通配符,這些通配符是一些特殊的字符, 用戶可以在命令行的參數(shù)中使用這些

    2024年02月07日
    瀏覽(25)
  • python之[正則表達式]--通配符使用方法(最新可用)

    . 匹配任意字符,除了換行符 ^ 匹配字符串開始的位置 $ 匹配字符串結束的位置,當出現(xiàn)多組符合的匹配時,返回字符串最后的那組匹配 * 匹配 0,1,n 次 前面的原子【貪婪模式:盡可能多的匹配】 ? 匹配 0,1 次 前面的原子【懶惰模式:精確匹配】 + 匹配 1,n 次 前面的原子

    2024年02月07日
    瀏覽(22)
  • 【算法題】44. 通配符匹配

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

    2024年01月25日
    瀏覽(19)
  • LeetCode 44題:通配符匹配

    LeetCode 44題:通配符匹配

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

    2024年02月11日
    瀏覽(22)
  • 算法leetcode|44. 通配符匹配(rust重拳出擊)

    給定一個字符串 ( s ) 和一個字符模式 ( p ) ,實現(xiàn)一個支持 \\\'?\\\' 和 \\\'*\\\' 的通配符匹配。 兩個字符串 完全匹配 才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p 可能為空,且只包含從 a-z 的小寫字母,以及字符 ? 和 * 。 面對這道算法題目,二當家的再次陷入了沉

    2023年04月09日
    瀏覽(14)
  • Spring Cloud Foundry上使用通配符模式匹配進行的安全繞過漏洞 CVE-2023-20873

    Spring Cloud Foundry上使用通配符模式匹配進行的安全繞過漏洞 CVE-2023-20873

    背景:公司項目掃描到 Spring Cloud Foundry上使用通配符模式匹配進行的安全繞過漏洞 CVE-2023-20873 CVE-2023-20873:在Cloud Foundry上使用通配符模式匹配進行的安全繞過 高風險 | 2023年5月18日 | CVE-2023-20873 在Spring Boot版本3.0.0 - 3.0.5, 2.7.0 - 2.7.10, 2.6.0 - 2.6.14, 2.5.0 - 2.5.14以及舊版支持的版本

    2024年02月09日
    瀏覽(23)
  • 動態(tài)規(guī)劃學習——通符串匹配,正則表達式

    動態(tài)規(guī)劃學習——通符串匹配,正則表達式

    目錄 ?編輯 一,通符串匹配 1.題目 2.題目接口 3,解題思路及其代碼 二,正則表達 ?1.題目 2.題目接口 3.解題思路及其代碼 三,交錯字符串 ?1.題目 2,題目接口 3.解題思路及其代碼 1.題目 給你一個輸入字符串 ( s ) 和一個字符模式 ( p ) ,請你實現(xiàn)一個支持? \\\'?\\\' ?和? \\\'*\\\' ?匹

    2024年02月03日
    瀏覽(14)
  • 動態(tài)規(guī)劃:LeetCode第10題 正則表達式匹配

    動態(tài)規(guī)劃:LeetCode第10題 正則表達式匹配

    給你一個字符串? s ?和一個字符規(guī)律? p ,請你來實現(xiàn)一個支持? \\\'.\\\' ?和? \\\'*\\\' ?的正則表達式匹配。 \\\'.\\\' ?匹配任意單個字符 \\\'*\\\' ?匹配零個或多個前面的那一個元素 所謂匹配,是要涵蓋? 整個? 字符串? s 的,而不是部分字符串。 1 = s.length?= 20 1 = p.length?= 20 s ?只包含從?

    2024年04月11日
    瀏覽(19)
  • 【動態(tài)規(guī)劃】【字符串】C++算法:正則表達式匹配

    【動態(tài)規(guī)劃】【字符串】C++算法:正則表達式匹配

    視頻算法專題 動態(tài)規(guī)劃匯總 字符串 給你一個字符串 s 和一個字符規(guī)律 p,請你來實現(xiàn)一個支持 ‘.’ 和 ‘ ’ 的正則表達式匹配。 ‘.’ 匹配任意單個字符 \\\' ’ 匹配零個或多個前面的那一個元素 所謂匹配,是要涵蓋 整個 字符串 s的,而不是部分字符串。 示例 1: 輸入:

    2024年02月03日
    瀏覽(38)
  • 【面試算法——動態(tài)規(guī)劃 21】正則表達式匹配(hard)&& 交錯字符串

    【面試算法——動態(tài)規(guī)劃 21】正則表達式匹配(hard)&& 交錯字符串

    鏈接: 10. 正則表達式匹配 給你一個字符串 s 和一個字符規(guī)律 p,請你來實現(xiàn)一個支持 ‘.’ 和 ‘*’ 的正則表達式匹配。 ‘.’ 匹配任意單個字符 ‘*’ 匹配零個或多個前面的那一個元素 所謂匹配,是要涵蓋 整個 字符串 s的,而不是部分字符串。 示例 1: 輸入:s = “aa”

    2024年02月08日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包