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