10 正規表示式匹配

2021-10-04 02:40:38 字數 1412 閱讀 8573

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

'.'匹配任意單個字元

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

示例1:

輸入:s = "aa「

p = 「a」

輸出:false

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

示例2:

輸入:s= 「aa」

p = 「a*」

輸出: true

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

示例3:

輸入:s = 「ab」

p = "."

輸出: true

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

思路狀態

首先狀態dp[i][j]表示前i個是否能被p的前j個匹配。

轉移方程

首先想的時候從已經求出了dp[i-1][j-1],再加上已知s[i]、p[j],要想問的問題就是怎麼去求dp[i][j].

已知dp[i-1][j-1]意思就是前面子串都匹配上了,不知道新的一位的情況。

分情況考慮,所以對於新的一位p[j] s[i]的值不同,要分情況討論:

1。考慮最簡單的p[j] ==s[i] : dp[i][j] = dp[i-1][j-1]

然後從p[j]可能的情況來考慮,讓p[j]=各種能等於的東西。

2. p[j] == 「.」 " dp[i][j] == dp[i-1] [j-1]

3. p[j] == " * ":

public

boolean

ismatch

(string s,string p)

boolean

dp =

newboolean

[s.length()

+1][p.

length()

+1];

dp[0]

[0]=

true

;//dp[i][j] 表示 s 的前 i 個是否能被 p 的前 j 個匹配

for(

int i =

0; i < p.

length()

; i++)}

for(

int i =

0; i < s.

length()

; i++)if

(p.charat

(j)==

'*')

else}}

}return dp[s.

length()

][p.

length()

];}

時間複雜度: o(n^2)

10 正規表示式匹配

implement regular expression matching with support for and matches any single character.matches zero or more of the preceding element.the matching sho...

10 正規表示式匹配

思路類似最長公共子串行,dp i j dp i 1 j 1 如果s i p j p j dp i j 2 如果p j s i p j 1 dp i 1 j dp i j 1 dp i 1 j 1 dp i 1 j 2 dp i j 2 如果p j s i p j 1 稍稍解釋下 對於s和p,設各個最...

10 正規表示式匹配

剛開始很奇怪為什麼這個題的標籤是困難,然後寫了出來發現我寫出來的只針對從頭到尾都一樣,而不是如示例4,可以匹配一部分。示例 4 輸入 s aab p c a b 輸出 true 解釋 因為 表示零個或多個,這裡 c 為 0 個,a 被重複一次。因此可以匹配字串 aab 只針對從頭到尾相同的字串的程式...