LeetCode 10. Regular Expression Matching

Posted 浩然

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 10. Regular Expression Matching相关的知识,希望对你有一定的参考价值。

https://leetcode.com/problems/regular-expression-matching/description/

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).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true

  • 字符串匹配。最后一个样例中匹配是因为*可以是0次匹配,i.e. c0a2b。
  • 递归法或者动态规划。
技术分享
 1 //
 2 //  main.cpp
 3 //  LeetCode
 4 //
 5 //  Created by Hao on 2017/3/16.
 6 //  Copyright © 2017年 Hao. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <string>
11 using namespace std;
12 
13 class Solution {
14 public:
15     bool isMatch(string s, string p) {
16         return isMatch(s.c_str(), p.c_str());
17     }
18 
19 private:
20     bool isMatch(const char *s, const char *p) {
21         if (*p == \0) return *s == \0;
22         
23         // next char is not ‘*‘, must match the current char
24         if (*(p + 1) != *) {
25             if ((*p == *s) || ((*p == .) && (*s != \0)))
26                 return isMatch(s + 1, p + 1);
27             else
28                 return false;
29         } else { // next char is ‘*‘
30             // ‘*‘ matches zero or more of the preceding element
31             while ((*p == *s) || ((*p == .) && (*s != \0))) {
32                 // check if the remaining string matches
33                 if (isMatch(s, p + 2))
34                     return true;
35                 // move point
36                 s ++;
37             }
38             // next matching
39             return isMatch(s, p + 2);
40         }
41     }
42 };
43 
44 int main ()
45 {
46     Solution testSolution;
47     string sTest[] = {"aa", "a", "aa", "aa", "aaa", "aa", "aa", "a*", "aa", ".*", "ab", ".*", "aab", "c*a*b"};
48 
49     for (int i = 0; i < 7; i ++)
50         cout << testSolution.isMatch(sTest[2 * i], sTest[2 * i + 1]) << endl;
51     
52     return 0;
53 }
View Code

 

以上是关于LeetCode 10. Regular Expression Matching的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 10. Regular Expression Matching

leetcode 10. Regular Expression Matching

Leetcode 10: Regular Expression Matching

[LeetCode #10] Regular Expression Matching

[LeetCode] 10. Regular Expression Matching ☆☆☆☆☆

leetcode-10. Regular Expression Matching