力扣LeetCode 10 正規表示式匹配

2021-09-24 03:20:36 字數 2118 閱讀 3314

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援'.''*'的正規表示式匹配。

'.'匹配任意單個字元

'*'匹配零個或多個前面的那乙個元素

所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。

說明:

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

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

示例 1:

輸入:

s = "aa"

p = "a"

輸出:false

解釋:"a"無法匹配"aa"整個字串。

示例 2:

輸入:

s = "aa"

p = "a*"

輸出:true

解釋: 因為'*'代表可以匹配零個或多個前面的那乙個元素, 在這裡前面的元素就是'a'。因此,字串"aa"可被視為'a'重複了一次。

示例 3:

輸入:

s = "ab"

p = ".*"

輸出:true

解釋:".*"表示可匹配零個或多個('*')任意字元('.')

示例 4:

輸入:

s = "aab"

p = "c*a*b"

輸出:true

解釋: 因為'*'表示零個或多個,這裡'c'為 0 個,'a'被重複一次。因此可以匹配字串"aab"

示例 5:

輸入:

s = "mississippi"

p = "mis*is*p*."

輸出:false

1、暴力遞迴,複雜度高,leetcode通不過,詳細分析見我的另一篇部落格。

2、動態規劃

dp[i][j]表示s[0, i)和p[0,j)範圍內是匹配的,不包括i和j
暴力遞迴過不了的特殊用例:

s =

"aaaaaaaaaaaaab"

p ="a*a*a*a*a*a*a*a*a*a*c"

動態規劃**:

// 動態規劃

// dp[i][j]表示s[0, i)和p[0,j)範圍內是匹配的,不包括i和j

class

solution

else}}

return dp[slen-1]

[plen-1]

;}};

暴力遞迴**:

// 邏輯沒有問題,但是複雜度太高 

class

solution1

bool

ismatched

(string s,

int sindex, string p,

int pindex)

else

if(sindex == s.

length()

&& pindex != p.

length()

)return

false;}

else

if(sindex != s.

length()

&& pindex == p.

length()

)else

else

}else

if(pindex < p.

length()

-1&& p[pindex+1]

=='*'

)else}}

return

false;}

};

LeetCode10 正規表示式

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...

leetcode 10 模式匹配

可以用動態規劃來做,dp i j 表示s的前i個字串能否被p的前j個字串所匹配。當s i p j p j 時 dp i j dp i 1 j 1 顯而易見 p j 時,1.s i p j 1 這就意味著此時 只能匹配0次 dp i j dp i j 2 2.s i s i p j 1 意味著 可以代...

LeetCode 10 正規表示式匹配

實現支援 和 的正規表示式匹配。匹配任意單個字元。匹配零個或多個前面的元素。匹配應該覆蓋整個輸入字串 不是部分字串 函式 bool ismatch const char s,const char p 例子 ismatch aa a false ismatch aa aa true ismatch a...