摘要:遞歸和動(dòng)規(guī)的方法沒(méi)有研究,說(shuō)一下較為直觀的貪心算法。用和兩個(gè)指針?lè)謩e標(biāo)記和進(jìn)行比較的位置,當(dāng)遍歷完后,若也遍歷完,說(shuō)明完全配對(duì)。當(dāng)之前出現(xiàn)過(guò),且此時(shí)和完全無(wú)法配對(duì)的時(shí)候,就一起退回在和配對(duì)過(guò)的位置。再將和逐個(gè)加繼續(xù)比較,并將后移。
Problem
Implement wildcard pattern matching with support for "?" and "*".
"?" Matches any single character.
"*" Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).
isMatch("aa","a") → false isMatch("aa","aa") → true isMatch("aaa","aa") → false isMatch("aa", "*") → true isMatch("aa", "a*") → true isMatch("ab", "?*") → true isMatch("aab", "c*a*b") → falseNote
遞歸和動(dòng)規(guī)的方法沒(méi)有研究,說(shuō)一下較為直觀的貪心算法。
用cs和cp兩個(gè)指針?lè)謩e標(biāo)記s和p進(jìn)行比較的位置,當(dāng)cs遍歷完s后,若cp也遍歷完p,說(shuō)明完全配對(duì)。
我們看一下while循環(huán)里的幾個(gè)分支:
第一個(gè)if語(yǔ)句,若cp和cs指向的字符相等,或cp指向的字符為"?",則說(shuō)明這一位配對(duì)成功,兩個(gè)指針繼續(xù)前移;
第二個(gè)else if語(yǔ)句,當(dāng)cp指向的字符為"*",則后面字符的配對(duì)結(jié)果要受到影響,必須用star和match分別在p和s的當(dāng)前位置,也就是cp和cs,進(jìn)行標(biāo)記。然后,cp前移,cs不動(dòng),為什么呢?因?yàn)?,如果此時(shí)cp == p.length(),就已經(jīng)可以結(jié)束while循環(huán)了;但若cp不是末位,那么p剩下的字符還要繼續(xù)判斷,至于cs,完全可以等到下一次成功配對(duì)字符后再移動(dòng);
第三個(gè)else if語(yǔ)句,這里最為費(fèi)解。當(dāng)p之前出現(xiàn)過(guò)star,且此時(shí)cp和cs完全無(wú)法配對(duì)的時(shí)候,就一起退回在star和match配對(duì)過(guò)的位置。再將cp和cs逐個(gè)加1繼續(xù)比較,并將match后移。為什么star不用后移呢?因?yàn)?b>star是大BOSS,可以任意和后面match走過(guò)的很多位配對(duì)下去呀;
最后一個(gè)else語(yǔ)句,返回false。但是這個(gè)false包含了哪些情況呢?其實(shí),就是p中沒(méi)有star且無(wú)法配對(duì)的情況。
再用一個(gè)while循環(huán)跳過(guò)p尾部的所有"*",如果有的話。
最后,若cp走完p,說(shuō)明完全配對(duì)。
Greedy
public class Solution { public boolean isMatch(String s, String p) { int cs = 0, cp = 0, star = -1, match = 0; while (cs < s.length()) { if (cp < p.length() && (p.charAt(cp) == s.charAt(cs) || p.charAt(cp) == "?")) { cs++; cp++; } else if (cp < p.length() && p.charAt(cp) == "*") { star = cp; match = cs; cp++; } else if (star != -1) { cp = star + 1; cs = match + 1; match++; } else return false; } while (cp < p.length() && p.charAt(cp) == "*") cp++; return cp == p.length(); } }
DP
public class Solution { public boolean isMatch(String s, String p) { if (s == null || p == null) return false; int lens = s.length(); int lenp = p.length(); boolean[][] dp = new boolean[lens + 1][lenp + 1]; boolean flag = false; for (int i = 0; i <= lens; i++) { flag = false; for (int j = 0; j <= lenp; j++) { if (i == 0 && j == 0) { dp[i][j] = true; flag = true; continue; } if (j == 0) { dp[i][j] = false; continue; } if (i == 0) dp[i][j] = dp[i][j - 1] && p.charAt(j - 1) == "*"; else dp[i][j] = (matchChar(s.charAt(i - 1), p.charAt(j - 1)) && dp[i - 1][j - 1]) || (p.charAt(j - 1) == "*" && (dp[i][j - 1] || dp[i - 1][j])); if (dp[i][j]) flag = true; if (dp[i][j] && p.charAt(j - 1) == "*" && j == lenp) return true; } if (!flag) return false; } return dp[lens][lenp]; } public static boolean matchChar(char c, char p) { return (p == "?" || p == c); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65965.html
摘要:正則由于的存在,所以有多種狀態(tài),中間狀態(tài)儲(chǔ)存都需要記錄下來(lái)。然后以這些狀態(tài)為動(dòng)態(tài)的中轉(zhuǎn),繼續(xù)判斷到最后。最后正則匹配字符串是否成功的判斷依據(jù),就是正則字符串的最大,是否出現(xiàn)在遍歷到最后的狀態(tài)列表中。 題目闡釋?zhuān)?正則匹配字符串,用程序?qū)崿F(xiàn) 關(guān)鍵理解: 正則匹配,動(dòng)態(tài)規(guī)劃思想,一個(gè)個(gè)向后追溯,后面的依賴(lài)前面的匹配成功。 正則和待匹配的字符串長(zhǎng)度不一,統(tǒng)一到正則字符串的index索引上,每...
摘要:當(dāng)我們遇到一個(gè)時(shí),因?yàn)橹罂赡芤嘶刂猎撐恢弥匦缕ヅ?,我們要將它的下?biāo)記錄下來(lái),比如。但是,當(dāng)我們連續(xù)遇到兩次的情況,如何保證我還是能繼續(xù)匹配,而不是每次都退回導(dǎo)致循環(huán)呢所以我們還要記錄一個(gè),用來(lái)記錄用上一個(gè)連續(xù)匹配到的中的下標(biāo)。 Wildcard Matching Implement wildcard pattern matching with support for ? and ...
摘要:題目鏈接這道題還是可以用的方法,用的數(shù)組來(lái)解,空間復(fù)雜度較高。和不同,這道題的符號(hào)和前面的沒(méi)有關(guān)系,不需要一起考慮。最壞的情況下,間隔出現(xiàn)且每個(gè)都要匹配很多字符,設(shè)一個(gè)平均匹配里面?zhèn)€字符,。其中,是的長(zhǎng)度,是的長(zhǎng)度。 Wildcard Matching 題目鏈接:https://leetcode.com/problems...這道題還是可以用Regular Expression Mat...
摘要:各一個(gè)指針,表示上一次真正到的位置。在的時(shí)候,上,增加下一步知道出界,發(fā)現(xiàn)是錯(cuò)誤的所以需要回到上次的地方,即一旦走出去,無(wú)法返回,需要一個(gè)指針記錄最后的地方。 public class Solution { public boolean isMatch(String s, String p) { int idxs = 0, idxp = 0, idxmatch ...
摘要:難度題目給出一個(gè)字符串和一個(gè)要求我們給出這個(gè)字符串是否匹配這個(gè)其中通配符跟我們平常見(jiàn)到的一樣是和代表任意單個(gè)字符代表一個(gè)或多個(gè)字符這個(gè)題跟簡(jiǎn)單正則匹配比較類(lèi)似可以跟這里面第二個(gè)解法一樣采取類(lèi)似的動(dòng)態(tài)規(guī)劃解法在里取中間某個(gè)確定的字符串序列將字 Implement wildcard pattern matching with support for ? and *. ? Matches ...
閱讀 2258·2021-11-22 09:34
閱讀 2030·2021-09-22 15:22
閱讀 2026·2019-08-29 15:05
閱讀 2117·2019-08-26 10:43
閱讀 3416·2019-08-26 10:26
閱讀 895·2019-08-23 18:29
閱讀 3526·2019-08-23 16:42
閱讀 2003·2019-08-23 14:46