1. 程式人生 > >Regular Expression Matching

Regular Expression Matching

emp src 如果 實現 targe pro 分享 str 題目

10. Regular Expression Matching

題目鏈接:https://leetcode.com/problems/regular-expression-matching/#/description

題目大意:實現一個正則表達式匹配函數。該正則表達式支持‘.‘和‘*‘。其中‘.‘匹配任意的單個字符,‘*‘匹配0個或多個前一個字符。函數參數為兩個字符串s和p,如果s可以被p完全匹配,則返回true,否則返回false。

思路:可以對多種情況進行分類討論。1、如果p為空字符串,則直接判斷s是否為空即可;2、p不為空,且p只包含一個字符,完全匹配的條件為s與p相等或者s只包含一個字符,且p[0]==‘.‘;3、p.size()>=2且p[1]==‘*‘,因為‘*‘匹配0個或多個前一個字符,所以s與p是否匹配可以轉換為:(1)s與p.substr(2)是否匹配,這時‘*‘匹配0個前一個字符;(2)s.substr(1)與p是否匹配,這時‘*‘匹配多個前一個字符(前提條件是s[0]與p[0]匹配);4、p.size()>=2且p[1]!=‘*‘,完全匹配的條件為s不為空,s[0]與p[0]匹配且s.substr(1)與p.substr(1)匹配。

算法復雜度:時間復雜度為O(n),空間復雜度為O(n)。

代碼:

 1 class Solution {
 2 public:
 3     bool isMatch(string s, string p) {
 4         if (p.empty())
 5             return s.empty();
 6         if (p.size() >= 2 && p[1] == *)
 7             return isMatch(s, p.substr(2)) || (!s.empty() && (s[0] == p[0
] || p[0] == .) && isMatch(s.substr(1), p)); 8 else 9 return !s.empty() && (s[0] == p[0] || p[0] == .) && isMatch(s.substr(1), p.substr(1)); 10 } 11 };

評測系統上運行結果:

技術分享

Regular Expression Matching