10 正規表示式匹配

2021-10-07 09:15:37 字數 2743 閱讀 4158

第一次寫文章,建立這個重要也是為了激勵自己不要混了,明年大四了,再混就沒了

先從刷題開始寫吧,順便充當一下自己的學習記錄

leetcode10:給你乙個字串 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 = 「cab」

輸出: true

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

示例 5:

輸入:s = 「mississippi」

p = 「misisp*.」

輸出: false

首先想到的是回溯來做題目,但是好久沒刷過題了腦子已經銹掉了,主要思路還是別人的,**也是一樣的,關鍵是他的**實在是打的太好了,沒啥能改的地方。主要也就講解**思路了。

class

solution

public

boolean

ismatch

(string s,string p,

int i,

int j)

else

i++;}

while

(i <= s.

length()

&&(p.

charat

(j)==

'.'|| s.

charat

(i -1)

== p.

charat

(j)));

return

false;}

}}

我認為這個**的難點在於對』』的處理上,因為』』是可以0個或多個的;

**中先將函式分出來ismatch 用這個好做回溯,在把回溯的結束句寫好

if(j == p.length()) return i == s.length();

這句也就是j字串判斷完全了,看s字串是否到頭,到頭了就是true

if (j == p.length() - 1 || p.charat(j + 1) != '』)

這句的if判斷我覺得打的很簡潔用if和?:就完成了這個就是判斷i與j所指的字元是否相等,還有』』的處理是在他前面乙個字元開始的

do i++;

} while (i <= s.length() && (p.charat(j) == 『.』 || s.charat(i - 1) == p.charat(j)));

return false;

這句是重點,判斷的是(i,s.length)與(j+2,p.length)的字串是否相等,並判斷j與i(後面是由於i++了所以是判斷與i-1)的字元是否相等

當不相等的時候就彈出返回false

方法二:動態規劃

我一直對動態規劃不太熟悉,一直沒用過這個演算法但是動態規劃做題還是挺多的。

這個動態規劃也是我copy的**嘻嘻,是官方的**

將s與p分為s的前i個字元是否可以和p的前j個字元匹配,也就分為了f[i][j]的boolean型別了

在分類有無』』的匹配

1.無的匹配,就是匹配s[i]與p[j]是否相等,相等就是f[i][j]=f[i-1][j-1]=true

不等就是f[i][j]=false

2.有*的匹配,又分為2個

(1)匹配1個或多個,也就是乙個因為多個分解下來就是乙個個匹配的

一直去判斷i-1與j-2是否相等不等則f[i-1][j]相等則f[i][j-2]

(2)匹配0個

直接f[i][j-2]

就是這個圖(官方截圖過來的)

**如下(官方**)

class

solution

}else}}

}return f[m]

[n];

}public

boolean

matches

(string s, string p,

int i,

int j)

if(p.

charat

(j -1)

=='.'

)return s.

charat

(i -1)

== p.

charat

(j -1);}}

如有解釋錯誤見諒

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 只針對從頭到尾相同的字串的程式...