二、題目解析
3. 遞迴
給定乙個字串 (s) 和乙個字元模式 ( p)。實現支援.
和*
的正規表示式匹配。匹配應該覆蓋整個字串 (s) ,而不是部分字串。
輸入:
s = "aa"
p = "a"
輸出:
false
解釋:
"a"
無法匹配"aa"
整個字串。
輸入:
s = "aa"
p = "a*"
輸出:
true
解釋:
'*'
代表可匹配零個或多個前面的元素, 即可以匹配'a'
。因此, 重複'a'
一次, 字串可變為"aa"
。
輸入:
s = "ab"
p = ".*"
輸出:
true
解釋:
".*"
表示可匹配零個或多個('*'
)任意字元('.'
)。
輸入:
s = "aab"
p = "c*a*b"
輸出:
true
解釋:
'c'
可以不被重複,'a'
可以被重複一次。因此可以匹配字串"aab"
。
輸入:來自
s = "mississippi"
p = "mis*is*p*."
輸出:
false
leetcode
第10題----正規表示式匹配
說句實話,剛上來我是沒讀懂這道題的,看了示例才知道,原來是這個樣子的:
既然這是動態規劃專題,我們就先考慮動態規劃求解吧:)2.1 思路
定義乙個二維的dp
陣列,其中dp[i][j]
表示s[0,i)
和p[0,j)
是否匹配,然後有下面三種情況:
d p[
i][j
]=
dp[i - 1][j - 1]\\ dp[i][j - 2]\\ dp[i - 1][j] \&\& (s[i - 1] == p[j - 2]\ ||\ p[j - 2] == '.') \end
dp[i][
j]=⎩
⎪⎨⎪⎧
dp[
i−1]
[j−1
]dp[
i][j
−2]d
p[i−
1][j
]&&(
s[i−
1]==
p[j−
2]∣∣
p[j−
2]==
′.′)
2.3 複雜度分析
時間複雜度:o(n
2)
o(n^2)
o(n2
)空間複雜度:o(n
2)
o(n^2)
o(n2)
2.4 **實現
class solution
// i表示s的前i位,j表示p的前j為
for (int i = 1; i < s.length() + 1; i++)
else}}
return dp[s.length()][p.length()];
}};
我們可以考慮最容易想到的遞迴解法的。
3.1 思路
3.2 複雜度分析
時間複雜度:o(n
2)
o(n^2)
o(n2
)空間複雜度:o(1
)o(1)
o(1)
3.3 **實現
class solution
if (p[1] != '*')
while (!s.empty() && (s[0] == p[0] || p[0] == '.'))
return ismatch(s, p.substr(2));
}};
動態規劃之正規表示式匹配
正規表示式匹配是真真的經典筆試 面試題了,這傢伙的動態規劃狀態轉移的細節得扣的仔仔細細,不然就是漏洞百出,著實細節魔鬼。當然本身的動態思路也是屬於比較困難的。很早之前做過的這題,再次覆盤發現還是會出問題。還是需要整理整理思路。力扣10.正規表示式匹配 關於題幹就不在詳述了,可以直接參考力扣原題。感謝...
LeetCode 正規表示式匹配(動態規劃)
難度 困難 給你乙個字串s和乙個字元規律p,請你來實現乙個支援 和 的正規表示式匹配。所謂匹配,是要涵蓋整個字串s的,而不是部分字串。示例1 輸入 s aa p a 輸出 false 解釋 a 無法匹配 aa 整個字串。示例2 輸入 s aab p c a b 輸出 true 解釋 因為 表示零個或...
正規表示式專題
工作中經常遇到分析log檔案,想從檔案中找到和對應資料的內容,其他的內容不關心.這樣就想用乙個正規表示式匹配指定字串之外的內容,替換成空的,剩下就是我們關心的log內容 正規表示式 需要將rdl報表裡的getcomment parameters f0001.value parameters f000...