Leetcode之萬用字元匹配

2021-10-24 15:50:51 字數 2703 閱讀 9521

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

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

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

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

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

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

示例 1:

輸入:

s = "aa"

p = "a"

輸出: false

解釋: "a" 無法匹配 "aa" 整個字串。

示例 2:

輸入:

s = "aa"

p = ""

輸出: true

解釋: '' 可以匹配任意字串。

示例 3:

輸入:

s = "cb"

p = "?a"

輸出: false

解釋: '?' 可以匹配 'c', 但第二個 'a' 無法匹配 'b'。

示例 4:

輸入:

s = "adceb"

p = "ab"

輸出: true

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

示例 5:

輸入:

s = "acdcb"

p = "a*c?b"

輸出: false

沒a出來。看了官方題解。我的思路是這樣的,對s中的每乙個字母去匹配。與p中的字母和'?'的匹配都是一定的。難搞的只有''。因此當s[i]要匹配到p[j],p[j]==''時,我對p[j+1]進行了討論。可以為空,為'?',為'',為字母,然後進行不同的處理。在匹配''時,獲得最接近它下乙個字母的在s中位置index,然後從這個位置去判斷(si,index)能不能夠匹配的上進行回溯。在法四中是採用了雙指標的做法記錄回溯。我的在過測試用例時有超過時間限制的。

在給定的模式 p 中,只會有三種型別的字元出現:

小寫字母 a−z,可以匹配對應的乙個小寫字母;

問號 ?,可以匹配任意乙個小寫字母;

星號 *,可以匹配任意字串,可以為空,也就是匹配零或任意多個小寫字母。

其中「小寫字母」和「問號」的匹配是確定的,而「星號」的匹配是不確定的,因此我們需要列舉所有的匹配情況。為了減少重複列舉,我們可以使用動態規劃來解決本題。

我們用 dp[i][j] 表示字串 s 的前i 個字元和模式 p 的前 j 個字元是否能匹配。在進行狀態轉移時,我們可以考慮模式 p的第 j 個字元 p[j],與之對應的是字串 s中的第 i 個字元 s[i]​:

只有確定了邊界條件,才能進行動態規劃。在上述的狀態轉移方程中,由於 dp[i][j] 對應著 s的前i個字元和模式p的前j個字元,因此所有的 dp[0][j]和dp[i][0]都是邊界條件,因為它們涉及到空字串或者空模式的情況,這是我們在狀態轉移方程中沒有考慮到的:

dp[0][0]==true,即當字串 s 和模式 p 均為空時,匹配成功;

dp[i][0]=false,即空模式無法匹配非空字串;

dp[0][j]需要分情況討論:因為星號才能匹配空字串,所以只有當模式 p 的前 j 個字元均為星號時,dp[0][j]才為真。

我們可以發現,dp[i][0]的值恒為假,dp[0][j]在 j 大於模式p的開頭出現的星號字元個數之後,值也恒為假,而 dp[i][j]的預設值(其它情況)也為假,因此在對動態規劃的陣列初始化時,我們就可以將所有的狀態初始化為 false減少狀態轉移的**編寫難度。

最終的答案即為 dp[m][n],其中 m和 n分別是字串 s 和模式 p 的長度。需要注意的是,由於大部分語言中字串的下標從 0開始,因此 s[i] 和 p[j] 分別對應著 s[i−1]和 p[j−1]。

class solution  else 

}if (pright == 0)

int sindex = 0, pindex = 0;

int srecord = -1, precord = -1;

while (sindex < sright && pindex < pright) else if (charmatch(s.charat(sindex), p.charat(pindex))) else if (srecord != -1 && srecord + 1 < sright) else

}return allstars(p, pindex, pright);

}public boolean allstars(string str, int left, int right)

}return true;

}public boolean charmatch(char u, char v)

}

public static boolean ismatch(string s, string p) else return false;

} while(j

return j==p.length();

}

leetcode 萬用字元匹配

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

LeetCode演算法練習之萬用字元匹配

上次的正規表示式匹配就是使用的動態規劃的方法,不過上一次因為寫完程式太晚了,就沒有想自下而上填表法實現的動態規劃。這次就直接使用填表法來解決問題吧。上次的分析同樣可以套用到這次的問題中。我們使用了乙個二維陣列來儲存每個小問題的答案,現在我們分析一下遞迴過程,就可以得出自下而上的填表法解決方案。這張圖...

萬用字元匹配 LeetCode44

給定乙個字串 s 和乙個字元模式 p 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。說明 示例 輸入 s aa p 輸出 true 解釋 可以匹配任意字串。dp陣列的含義 dp i j 表示字串中前i個字元和字元模式中前j個字元是...