implement wildcard pattern matching with support for '?' and '*'.時間 o(n) 空間 o(1)'?' matches any single character. '*' matches any sequence of characters (including the empty sequence).
the matching should cover the entire input string (not partial).
the function prototype should be: bool
ismatch(const char *s, const char *p)
some examples:
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") → false
假設我們用兩個指標分別指向s和p字串中要匹配的位置,首先分析下萬用字元匹配過程中會有哪些情況是成功:
s的字元和p的字元相等
p中的字元是?
,這時無論s的字元是什麼都可以匹配乙個
p中遇到了乙個*
,這時無論s的字元是什麼都沒關係
s已經匹配完,但是p後面還有很多連續的`*
當在某一位置p和s不匹配時,
我們可以從*
後面開始匹配,即p.start=start+1;
這裡1和2的情況比較好處理,關鍵在於如何處理3和4的情況。當我們遇到乙個*
時,因為之後可能要退回至該位置重新匹配,我們要將它的下標記錄下來,比如idxstar
。但是,當我們連續遇到兩次4的情況,如何保證我還是能繼續匹配s,而不是每次都退回idxstar+1
導致迴圈呢?所以我們還要記錄乙個idxmatch
,用來記錄用上乙個*
連續匹配到的s中的下標。最後,對於情況5,我們用乙個迴圈跳過末尾的*
跳過就行了。
public
class
solution
else
if(idxp < p.length() && p.charat
(idxp)
=='*') else
if(idxstar != -1)
else
}// 因為1個*能匹配無限序列,如果p末尾有多個*,我們都要跳過
while(idxp < p.length() && p.charat(idxp) == '*')
// 如果p匹配完了,說明匹配成功
return idxp == p.length();
}}
原文本串匹配之bf演算法/
主題演算法
bf(brute force)演算法是模式匹配中最簡單最直觀的演算法, 其基本思想是從主串t(t0,t1,t2,t3…t(n-1))中的第start個自字元起和模式p的第乙個字元進行比較, 如果相等, 則繼續比較後續字元; 如果不相等, 則回溯至主串中的第start+1個字元位置繼續和模式p進行比較. 以此類推, 直到模式p中每個字元都和主串t中的乙個連續字串行完全相同, 則匹配成功, 否則,匹配失敗.
bf演算法是一種蠻力演算法, 其特點是簡單直觀, 但由於涉及到多次回溯, 演算法效率很低. 不適用於資訊量較大的情況.
下面給出bf的乙個實現如下:
//
// main.cpp
// bf
//// created by scarecrow on 16/12/7.
//#include
using
namespace
std;
#define no_match -1
#define len_error -2
/** 字串模式匹配之bf演算法
@param t 主串
@param p 模式(子串)
@param start 起始匹配索引(t)
@return 匹配結果
*/int
bruteforce
(char
const t, char
const p, int
const start)
intindex_t = start;
int index_p = 0;
while (index_p < len_p && index_t
< len_t) else
}if (index_p >= len_p)
return no_match;
}int
main
(int argc, const
char * argv)
萬用字元匹配
給定乙個輸入字串s 和模式p,p包含萬用字元?與星號 其中輸入s包含小寫字母a z,p包含小寫字母a z與?和星號,可以匹配任一字元,星號 可以匹配多個字元,包括空字元。給定輸入s與p,判斷s 與 p是否完全匹配。example 1 input s aa p a output false expla...
萬用字元匹配
1.遇到s和p都是 則直接返回true 2.判斷邊界條件如果s串已經遍歷完畢,則判斷p串是否便利完畢,如果p串長度大於s串,則判斷大於部分是否都是 如果是則返回true,否則返回false 3.判斷邊界條件如果p串已經便利完畢,則判斷s串是否便利完畢,是則返回true,否則返回false 4.判斷字...
萬用字元匹配
題目 力扣 解題思路 一開始用了遞迴來做,超時了 遞迴的思路 1 當字串和模式串為空時,直接返回true。2 當字串不為空但模式串為空時,返回false 3 當字串為空時,模式串不為空,需要判斷,如果模式串全為 則返回true,否則返回false。4 當字串和模式串均不為空時,也需要判斷。先判斷第乙...