給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援'.'
和'*'
的正規表示式匹配。
'.'
匹配任意單個字元
'*'
匹配零個或多個前面的那乙個元素
所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。
說明:
示例 1:s 可能為空,且只包含從 a-z 的小寫字母。
p 可能為空,且只包含從 a-z 的小寫字母,以及字元 . 和 *。
輸入:
輸出: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 = "c*a*b"
true
解釋: 因為'*'
表示零個或多個,這裡'c'
為 0 個,'a'
被重複一次。因此可以匹配字串"aab"
。
示例 5:
輸入:
輸出:s = "mississippi"
p = "mis*is*p*."
false
1、暴力遞迴,複雜度高,leetcode通不過,詳細分析見我的另一篇部落格。
2、動態規劃
dp[i][j]表示s[0, i)和p[0,j)範圍內是匹配的,不包括i和j
暴力遞迴過不了的特殊用例:
動態規劃**:s =
"aaaaaaaaaaaaab"
p ="a*a*a*a*a*a*a*a*a*a*c"
暴力遞迴**:// 動態規劃
// dp[i][j]表示s[0, i)和p[0,j)範圍內是匹配的,不包括i和j
class
solution
else}}
return dp[slen-1]
[plen-1]
;}};
// 邏輯沒有問題,但是複雜度太高
class
solution1
bool
ismatched
(string s,
int sindex, string p,
int pindex)
else
if(sindex == s.
length()
&& pindex != p.
length()
)return
false;}
else
if(sindex != s.
length()
&& pindex == p.
length()
)else
else
}else
if(pindex < p.
length()
-1&& p[pindex+1]
=='*'
)else}}
return
false;}
};
LeetCode10 正規表示式
給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...
leetcode 10 模式匹配
可以用動態規劃來做,dp i j 表示s的前i個字串能否被p的前j個字串所匹配。當s i p j p j 時 dp i j dp i 1 j 1 顯而易見 p j 時,1.s i p j 1 這就意味著此時 只能匹配0次 dp i j dp i j 2 2.s i s i p j 1 意味著 可以代...
LeetCode 10 正規表示式匹配
實現支援 和 的正規表示式匹配。匹配任意單個字元。匹配零個或多個前面的元素。匹配應該覆蓋整個輸入字串 不是部分字串 函式 bool ismatch const char s,const char p 例子 ismatch aa a false ismatch aa aa true ismatch a...