給定乙個字串 (s) 和乙個字元模式 (p) ,實現乙個支援 '?' 和 '' 的萬用字元匹配。
'?' 可以匹配任何單個字元。
'' 可以匹配任意字串(包括空字串)。
兩個字串完全匹配才算匹配成功。
說明:s 可能為空,且只包含從 a-z 的小寫字母。
p 可能為空,且只包含從 a-z 的小寫字母,以及字元 ? 和 *。
示例 1:
輸入:示例 2:s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字串。
輸入:示例 3:s = "aa"
p = ""
輸出: true
解釋: '' 可以匹配任意字串。
輸入:示例 4:s = "cb"
p = "?a"
輸出: false
解釋: '?' 可以匹配 'c', 但第二個 'a' 無法匹配 'b'。
輸入:示例 5:s = "adceb"
p = "ab"
輸出: true
解釋: 第乙個 '' 可以匹配空字串, 第二個 '' 可以匹配字串 "dce".
輸入:沒a出來。看了官方題解。我的思路是這樣的,對s中的每乙個字母去匹配。與p中的字母和'?'的匹配都是一定的。難搞的只有''。因此當s[i]要匹配到p[j],p[j]==''時,我對p[j+1]進行了討論。可以為空,為'?',為'',為字母,然後進行不同的處理。在匹配''時,獲得最接近它下乙個字母的在s中位置index,然後從這個位置去判斷(si,index)能不能夠匹配的上進行回溯。在法四中是採用了雙指標的做法記錄回溯。我的在過測試用例時有超過時間限制的。s = "acdcb"
p = "a*c?b"
輸出: false
在給定的模式 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個字元是...