萬用字元匹配

2021-07-25 06:10:17 字數 2621 閱讀 6000

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).

the function prototype should be: boolismatch(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

時間 o(n) 空間 o(1)

假設我們用兩個指標分別指向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 當字串和模式串均不為空時,也需要判斷。先判斷第乙...