LeetCode #10 Regular Expression Matching 正則表達(dá)式匹配

10 Regular Expression Matching 正則表達(dá)式匹配

Description:
Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).

Note:

s could be empty and contains only lowercase letters a-z.
p could be empty and contains only lowercase letters a-z, and characters like . or *.

Example:

Example 1:

Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".

Example 2:

Input:
s = "aa"
p = "a*"
Output: true
Explanation: '*' means zero or more of the preceding element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

Example 3:

Input:
s = "ab"
p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".

Example 4:

Input:
s = "aab"
p = "c*a*b"
Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore, it matches "aab".

Example 5:

Input:
s = "mississippi"
p = "mis*is*p*."
Output: false

題目描述:
給你一個字符串 s 和一個字符規(guī)律 p缔逛,請你來實現(xiàn)一個支持 '.' 和 '*' 的正則表達(dá)式匹配谱轨。

'.' 匹配任意單個字符
'*' 匹配零個或多個前面的那一個元素
所謂匹配撮抓,是要涵蓋 整個 字符串 s的,而不是部分字符串隆圆。

說明:

s 可能為空抹凳,且只包含從 a-z 的小寫字母漂彤。
p 可能為空鸯匹,且只包含從 a-z 的小寫字母坊饶,以及字符 . 和 *。

示例 :
示例 1:

輸入:
s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字符串殴蓬。

示例 2:

輸入:
s = "aa"
p = "a*"
輸出: true
解釋: 因為 '*' 代表可以匹配零個或多個前面的那一個元素, 在這里前面的元素就是 'a'匿级。因此,字符串 "aa" 可被視為 'a' 重復(fù)了一次染厅。

示例 3:

輸入:
s = "ab"
p = ".*"
輸出: true
解釋: ".*" 表示可匹配零個或多個('*')任意字符('.')痘绎。

示例 4:

輸入:
s = "aab"
p = "c*a*b"
輸出: true
解釋: 因為 '*' 表示零個或多個,這里 'c' 為 0 個, 'a' 被重復(fù)一次肖粮。因此可以匹配字符串 "aab"孤页。

示例 5:

輸入:
s = "mississippi"
p = "mis*is*p*."
輸出: false

思路:

  1. 雙字符串匹配, 會產(chǎn)生大量子問題, 可以用動態(tài)規(guī)劃解決
  2. 首先定義 dp[i][j]表示 s[:i]和p[:j]匹配
  3. 從 dp[i - 1][j - 1]出發(fā), 觀察 s[i]和 p[j]
    3.1 最簡單的情況, s[i] == p[j], 則 dp[i][j] = dp[i - 1][j - 1]
    3.2 若 p[j] == ".", 也可以直接匹配, 則dp[i][j] = dp[i - 1][j - 1]
    3.3 若 p[j] == "*", 要匹配之前的字符 0個或多個, 這里又可以分兩種情況, 一種是 p[j - 1] == s[i](p[j - 1] == "."也是歸類到這一種), 那么可以匹配, 有dp[i][j] = dp[i - 1][j - 1], 另一種是 p[j - 1] != s[i], 這里可以看是否是 0個匹配, 要看 dp[i][j - 2], 所以有dp[i][j] = dp[i][j - 2]

時間復(fù)雜度O(mn), 空間復(fù)雜度O(mn), n, m分別為 s和 p的長度
注意到這里只使用了 dp兩行相鄰的, 可以將空間復(fù)雜度減小到 O(m)

代碼:
C++:

class Solution 
{
public:
    bool isMatch(string s, string p) 
    {
        int n = s.size(), m = p.size();
        bool dp[n + 1][m + 1];
        for (int i = 0; i <= n; i++) for(int j = 0; j <= m; j++) dp[i][j] = false;
        dp[0][0] = true;
        for (int i = 2; i <= m; i++) if (p[i - 1] == '*') dp[0][i] = dp[0][i - 2];
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                if (s[i - 1] == p[j - 1] or p[j - 1] == '.') dp[i][j] = dp[i - 1][j - 1];
                if (p[j - 1] == '*') if (j > 1) dp[i][j] = ((p[j - 2] == s[i - 1] or p[j - 2] == '.') and dp[i - 1][j]) or dp[i][j - 2];
            }
        }   
        return dp[n][m];
    }
};

Java:

class Solution {
    public boolean isMatch(String s, String p) {
        return s.matches(p);
    }
}

Python:

class Solution:
    def isMatch(self, s: str, p: str) -> bool:
        return re.match(p + '$', s)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涩馆,隨后出現(xiàn)的幾起案子行施,更是在濱河造成了極大的恐慌,老刑警劉巖魂那,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悲龟,死亡現(xiàn)場離奇詭異,居然都是意外死亡冰寻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門皿渗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斩芭,“玉大人,你說我怎么就攤上這事乐疆』裕” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵挤土,是天一觀的道長琴庵。 經(jīng)常有香客問我,道長仰美,這世上最難降的妖魔是什么迷殿? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮咖杂,結(jié)果婚禮上庆寺,老公的妹妹穿的比我還像新娘。我一直安慰自己诉字,他們只是感情好懦尝,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布知纷。 她就那樣靜靜地躺著,像睡著了一般陵霉。 火紅的嫁衣襯著肌膚如雪琅轧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天踊挠,我揣著相機與錄音乍桂,去河邊找鬼。 笑死止毕,一個胖子當(dāng)著我的面吹牛模蜡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扁凛,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼忍疾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谨朝?” 一聲冷哼從身側(cè)響起卤妒,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎字币,沒想到半個月后则披,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡洗出,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年士复,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翩活。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡阱洪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菠镇,到底是詐尸還是另有隱情冗荸,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布利耍,位于F島的核電站蚌本,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隘梨。R本人自食惡果不足惜程癌,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轴猎。 院中可真熱鬧席楚,春花似錦、人聲如沸税稼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至只祠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抛寝,已是汗流浹背熊杨。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工盗舰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钻趋。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓川陆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛮位。 傳聞我的和親對象是個殘疾皇子较沪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容