第一次寫文章,建立這個重要也是為了激勵自己不要混了,明年大四了,再混就沒了
先從刷題開始寫吧,順便充當一下自己的學習記錄
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 只針對從頭到尾相同的字串的程式...