LeetCode刻意練習30 萬用字元匹配

2021-10-23 01:43:19 字數 2984 閱讀 2518

題目:

給定乙個字串 (s) 和乙個字元模式 § ,實現乙個支援 『?』 和 『*』 的萬用字元匹配。

『?』 可以匹配任何單個字元。

『*』 可以匹配任意字串(包括空字串)。

兩個字串完全匹配才算匹配成功。

說明:s 可能為空,且只包含從 a-z 的小寫字母。

p 可能為空,且只包含從 a-z 的小寫字母,以及字元 ? 和 *。

方法一:遞迴

這道題很容易想到遞迴演算法,我們利用兩個變數跟蹤我們要匹配的字串,先匹配第乙個字元,如果第乙個字元是匹配的,則匹配剩下的字串。

string

abcde

pattern

a*de

例如我們要看string和pattern是否匹配,則看第乙個字元是否匹配,如果是,則匹配剩下的字串,否則,這兩個字元是不匹配的。

string

abcde

pattern

a*de

如何判斷一對字元是否匹配呢?

假設 a 是string裡的乙個字元, b 是pattern裡的乙個字元,這兩個字元匹配的條件是

(1) a=b

(2) b=』?』

(3) b=『 * 』

上述的條件滿足其中乙個即可。

(1)(2)很好理解,主要看(3),當pattern裡出現 『 * 』如何處理。

如果 pattern 裡出現 『*』

string

bcde

pattern

*de*可以匹配0-n個字元,所以就是看下列字串是否匹配:

string

bcde

patternde

string

cdepatternde

string

depattern

de**實現如下:

public

boolean

ismatch

(string s, string p)

public

boolean

ismatchrecursive

(char

s,char

p,int i,

int j)

}else

//計較*ab

/* 先-1,為了保證可以匹配0個

*/i--

;while

(i < s.length)

return

false;}

}

對這個演算法進行遞迴樹分析,可以很清楚的看出有許多重疊的子問題,因此特別費時。

方法二:動態規劃(自底向上)

一般能夠用遞迴演算法的都可以用動態規劃解決,動態規劃有兩種方法,一種是自頂向下(記憶法),一種是自底向上(填表法)。一般自底向上更簡潔,更容易理解。

我們先建立乙個**用來記錄子字串是否已經匹配過了。

t[i][j] 的值表示的string[0-i] 和pattern[0-j]是否匹配,如果匹配則存 true,否則 存 false,這是乙個bool表。

填表的規則:

1 t[0][0]=true 兩個字元均為空字元

2.如果string[ i ]==pattern[ j ],t[i][j]是否匹配取決於前面的字串t[i-1][j-1]是否匹配。

舉個例子:索引0

12stringba

epatternca

dstring[1]==pattern[1]=a,但是因為他們前面的字串是不匹配的,因此他們也不匹配。

3.如果pattern[ j ]=』?』,t[i][j]是否匹配取決於前面的字串t[i-1][j-1]是否匹配。

舉個例子:索引0

12stringba

epattern?a

dpattern[ j ]=』?』,因為他們前面的字串是匹配的(都是空),因此他們也匹配。

4.如果pattern[ j ]=』*』,t[i][j]是否匹配取決於前面的字串t[i][j-1]或者t[i-1][j]是否匹配。索引0

兩個的關係是或,因此只要有乙個是true,則t[i][j]是true。

5.上述均不符合,則填入f

我們根據上述填表規則舉個例子。

string =「baced」 行表頭

pattern=「b**a?ed」列表頭

**實現如下:

LeetCode 刻意練習03 移除元素

題目 引數列表給定乙個陣列 nums 和乙個值 val,你需要原地移除所有數值等於 val 的元素,返回值 移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。思路 遍歷陣列,如果遇到不為val的值則將其賦值給陣列第i元素,並且i 否則繼續遍歷...

LeetCode刻意練習28 跳躍遊戲

題目 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。方法一 回溯法 有一組資料超時。遍歷每個元素,對於每個元素i,先跳最大的步數nums i 到達下乙個元素next。如果能夠跳出這個陣列 nums i i nums...

《刻意練習》5

不管是 還是體育等等領域,該領域中最傑出的人在青少年時期總是經過了漫長的練習才取得了如今的成績。並且投入的時間與取得的成績成正比。1 首先,它需要乙個已經得到合理發展的行業或領域,也就是說,在那一行業或領域之中,最傑出的從業者已達到一定程度的表現水平,使他們與其他剛剛進入該行業或領域的人們明顯地區分...