DP萬用字元匹配

2021-09-24 22:56:05 字數 2099 閱讀 1781

給定乙個字串 (s) 和乙個字元模式 (p) ,實現乙個支援 '?' 和 '*' 的萬用字元匹配。

'?' 可以匹配任何單個字元。

'*' 可以匹配任意字串(包括空字串)。

兩個字串完全匹配才算匹配成功。

說明:s 可能為空,且只包含從 a-z 的小寫字母。

p 可能為空,且只包含從 a-z 的小寫字母,以及字元 ? 和 *。

輸入:s = "adceb"

p = "*a*b"

輸出: true

解釋: 第乙個 '*' 可以匹配空字串, 第二個 '*' 可以匹配字串 "dce".

可以用遞迴和dp解,dp挺長時間不用都忘了,大一acm訓練看完dp方法就開始刷題,基本是建二維或一維dp陣列,找轉換方程,填dp,當時分類做的題,上來就是建dp陣列,比較機械,硬做。。。時間一長印象不深,現在準備找工作基本都忘了,用這道題好好複習下加一些理解。

dp求解要求最優子結構和子問題重疊,最優子結構保證子問題結合後的解就是整個問題的解,子問題重疊是在遞迴求解時,每次求解的子問題不總是新問題,有的子問題重複計算,dp利用這個性質,通過建立dp表,只計算子問題一次,然後將結果儲存在dp表中,再次用到計算過的子問題時,直接根據狀態轉移方程查表可以得到當前值,提高效率。

s,p0*a

*b01

1000

a011

10d0

1010

c010

10e0

1010

b010

11根據輸入資料建dp表,(0,0)表示兩個空字串匹配,直接設為1(true)。

第一行(a上邊的0哪行)為初始化,表示模式串p與空字串的匹配結果,*與空串匹配為1,*可以匹配空串,a處表示*a與空串匹配,a前面的*可以匹配空,但a不能匹配空,所以*a不能匹配空串,第二個*表示*a*與空串匹配,雖然第二個*能匹配空串,但前面的*a結果是已經不能匹配空串,所以*a*也不能匹配空串,當前的dp錶值是按照全面的值推出的,以此類推第一行的b下的值為0。

第一列(*左邊0那列)也為初始化,表示模式串p為空,分別與源串匹配,肯定都是空。

從第二行二列(1,1)開始是利用狀態轉移方程填表,狀態轉移方程可以表示為:

dp[i][j]=dp[i-1][j-1]               s[i]==p[j]||p[j]=='?'

dp[i][j]=dp[i-1][j]||dp[i][j-1]            p[j]=='*'

其中s[i]==p[j]||p[j]=='?'表示當前模式串字元p[j]與源串字元s[i]相同,dp[i][j]=dp[i-1][j-1]表示既然s[i]與p[j]字元相同,那麼當前串s(從0到i的字串)和模式串p(0到j)是否匹配的結果就是它們之前的串(s[0.....i-1],p[0.....j-1])的結果,因為當前字元是相同的。

其中p[j]=='*'表示模式串遇到了*這個字元,*比較特殊,既能匹配空字串,又能匹配任意字串。

當匹配了空串時,此時的dp[i][j]值就是s[i]和p[j-1]的值即為dp[i][j-1] 。如s=adc,p=*a*,當比較c與第二個*時,如果第二個*不匹配任何字串,那麼當前的dp[i][j]值就是adc和*a匹配的值,即dp[i][j-1]。

當匹配乙個或多個字元時,dp[i][j]值就是s[i-1]和p[j]的值即為dp[i-1][j](匹配多個字元時為dp[i-n][j],由於是迭代逐個求解,求dp[i-n-1][j]時會包含dp[i-n][j]的解,以此類推dp[i-1][j]也就包括了dp[i-n][j],即dp[i-1][j]==dp[i-n][j])。如s=adc,p=*a*,當比較c與第二個*時,如果匹配了乙個字元,那麼當前的dp[i][j]值就是ad和*a*匹配的值,即dp[i-1][j]。如果匹配了兩個字元,那麼當前的dp[i][j]值就是a和*a*匹配的值,即dp[i-2][j],但求ad和*a*匹配時已經求出a和*a*是否匹配了,dp[i-1][j]是根據dp[i-2][j]求解的,所以dp[i-1][j]==dp[i-n][j]。

**:

class solution

for(int i=1;i能力有限,可能理解不對,歡迎交流。

dp 萬用字元匹配leetcode44

這一題是劍指offer裡面的題目,但是書本裡的解法自頂向下,不太好理解。假設string長度為s,pattern長度為p,設定狀態dp,為 dp s 1 p 1 狀態含義 dp i j 表示pattern的1到j位是否匹配s的1 i位 初始狀態 dp 0 0 1 dp 0 i p i dp 0 i ...

44 萬用字元匹配。 DP

給定乙個字串 s 和乙個字元模式 p 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例 1 輸入 s aa p a ...

萬用字元匹配

implement wildcard pattern matching with support for and matches any single character.matches any sequence of characters including the empty sequence ...