摘要:題目鏈接這道題還是可以用的方法,用的數(shù)組來解,空間復雜度較高。和不同,這道題的符號和前面的沒有關(guān)系,不需要一起考慮。最壞的情況下,間隔出現(xiàn)且每個都要匹配很多字符,設一個平均匹配里面?zhèn)€字符,。其中,是的長度,是的長度。
Wildcard Matching
題目鏈接:
https://leetcode.com/problems...
這道題還是可以用"Regular Expression Matching" 的方法,用2d的dp數(shù)組來解,空間復雜度較高。
public boolean isMatch(String s, String p) { /* boolean dp[len(s) + 1][len(p) + 1] * dp[i+1][j+1] means if s[0, i] match p[0, j] * function: dp[i+1][j+1] * a. p[j] = * => 1. empty: dp[i+1][j] * 2. one: dp[i][j] * 3. multiple: dp[i][j+1] * b. p[j] = s[i] | p[j] = ? => dp[i][j] * start: dp[0][0] = true, dp[0][j+1] = dp[0][j] & p[j] = * * result: dp[len(s)][len(p)] */ boolean[][] dp = new boolean[s.length() + 1][p.length() + 1]; // start dp[0][0] = true; for(int j = 0; j < p.length(); j++) dp[0][j+1] = dp[0][j] & (p.charAt(j) == "*"); // loop for(int i = 0; i < s.length(); i++) { for(int j = 0; j < p.length(); j++) { if(p.charAt(j) == "*") { dp[i+1][j+1] = dp[i+1][j] | dp[i][j] | dp[i][j+1]; } else if(p.charAt(j) == s.charAt(i) || p.charAt(j) == "?") dp[i+1][j+1] = dp[i][j]; } } return dp[s.length()][p.length()]; }
另一種思路是greedy,只需要O(1)的空間。和regular expression不同,這道題的star符號和前面的character沒有關(guān)系,不需要一起考慮。而且star是可以匹配任何string的,"aa", "ab"都可以。所以check是否匹配的時候,只需要按位一個一個判斷就行了。用兩個指針i和j分別掃描s和p,loop過程中有以下幾種情況:
成功匹配:s[i] == p[j] or p[j] == "?" => i++, j++
出現(xiàn)星號:p[j] == "*"
匹配不上:return false
第二種情況比較麻煩,多帶帶討論一下。
p[j]匹配0個 => j++
p[j]匹配1個 => j++, i += 1
p[j]匹配2個 => j++, i += 2
......
可以看出來,要嘗試不同的匹配個數(shù),所以要加兩個指針保存之前出現(xiàn)star時的i和j:stari和starj。那么每次碰到"*"的時候,都保存一下,先試下匹配0個的時候后面的字符是否可以匹配上,如果不行再試1個,2個。。重復這個過程。
以s的長度為loop的終點,所以最后還要考慮一下p后面還有多的"*"的情況。
最好的情況下,沒有star或者所有star都匹配0個字符,O(M+N)。
最壞的情況下,star間隔出現(xiàn)且每個star都要匹配很多字符,設一個star平均匹配s里面x個字符,O(xN + M) = O(M*N)。其中,M是s的長度,N是p的長度。
public boolean isMatch(String s, String p) { int i = 0, j = 0; int stari = -1, starj = -1; while(i < s.length()) { // 1. match if(j < p.length() && (s.charAt(i) == p.charAt(j) || p.charAt(j) == "?")) { i++; j++; } // 2. star else if(j < p.length() && p.charAt(j) == "*") { // first match 0 stari = i; starj = ++j; } // different number that "*" matches else if(stari != -1) { // match number +1 i = ++stari; j = starj; } // 3. not match and no star else return false; } // remove last "*" in p while(j < p.length() && p.charAt(j) == "*") j++; return j == p.length(); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66562.html
摘要:正則由于的存在,所以有多種狀態(tài),中間狀態(tài)儲存都需要記錄下來。然后以這些狀態(tài)為動態(tài)的中轉(zhuǎn),繼續(xù)判斷到最后。最后正則匹配字符串是否成功的判斷依據(jù),就是正則字符串的最大,是否出現(xiàn)在遍歷到最后的狀態(tài)列表中。 題目闡釋: 正則匹配字符串,用程序?qū)崿F(xiàn) 關(guān)鍵理解: 正則匹配,動態(tài)規(guī)劃思想,一個個向后追溯,后面的依賴前面的匹配成功。 正則和待匹配的字符串長度不一,統(tǒng)一到正則字符串的index索引上,每...
摘要:當我們遇到一個時,因為之后可能要退回至該位置重新匹配,我們要將它的下標記錄下來,比如。但是,當我們連續(xù)遇到兩次的情況,如何保證我還是能繼續(xù)匹配,而不是每次都退回導致循環(huán)呢所以我們還要記錄一個,用來記錄用上一個連續(xù)匹配到的中的下標。 Wildcard Matching Implement wildcard pattern matching with support for ? and ...
摘要:遞歸和動規(guī)的方法沒有研究,說一下較為直觀的貪心算法。用和兩個指針分別標記和進行比較的位置,當遍歷完后,若也遍歷完,說明完全配對。當之前出現(xiàn)過,且此時和完全無法配對的時候,就一起退回在和配對過的位置。再將和逐個加繼續(xù)比較,并將后移。 Problem Implement wildcard pattern matching with support for ? and *. ? Matche...
摘要:各一個指針,表示上一次真正到的位置。在的時候,上,增加下一步知道出界,發(fā)現(xiàn)是錯誤的所以需要回到上次的地方,即一旦走出去,無法返回,需要一個指針記錄最后的地方。 public class Solution { public boolean isMatch(String s, String p) { int idxs = 0, idxp = 0, idxmatch ...
摘要:難度題目給出一個字符串和一個要求我們給出這個字符串是否匹配這個其中通配符跟我們平常見到的一樣是和代表任意單個字符代表一個或多個字符這個題跟簡單正則匹配比較類似可以跟這里面第二個解法一樣采取類似的動態(tài)規(guī)劃解法在里取中間某個確定的字符串序列將字 Implement wildcard pattern matching with support for ? and *. ? Matches ...
閱讀 883·2021-11-22 12:04
閱讀 2088·2021-11-02 14:46
閱讀 616·2021-08-30 09:44
閱讀 2098·2019-08-30 15:54
閱讀 715·2019-08-29 13:48
閱讀 1587·2019-08-29 12:56
閱讀 3441·2019-08-28 17:51
閱讀 3279·2019-08-26 13:44