zoukankan      html  css  js  c++  java
  • LeetCode | Regular Expression Matching

    Regular Expression Matching

    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

    思路是分别处理a*、.*、.、a的情况。

    三周前写的lengthy code如下:

     1 class Solution {
     2 public:
     3     bool isMatch(const char *s, const char *p) {
     4         int sn = strlen(s);
     5         int pn = strlen(p);
     6         return recursive(s, sn, p, pn);
     7     }
     8     
     9     bool recursive(const char* s, int sn, const char* p, int pn) {
    10         if (sn == 0 && pn == 0) return true;
    11         if (pn == 0) return false;
    12         
    13         if (*(p + 1) != '') {
    14             if (*(p + 1) == '*') {
    15                 if (*p == '.') { // .*
    16                     int n = 0;
    17                     while (n <= sn) {
    18                         if (recursive(s + n, sn - n, p + 2, pn - 2)) return true;
    19                         n++;
    20                     }
    21                 } else { // a*
    22                     int n = 0;
    23                     while (n <= sn && *(s + n) == *p) {
    24                         if (recursive(s + n, sn - n, p + 2, pn - 2)) return true;
    25                         n++;
    26                     }
    27                     if (recursive(s + n, sn - n, p + 2, pn - 2)) return true;
    28                 }
    29             } else {
    30                 if (*p != '.' && *s != *p) return false;
    31                 if (recursive(s + 1, sn - 1, p + 1, pn - 1)) return true;
    32             }
    33         } else {
    34             if (*p != '.' && *s != *p) return false;
    35             if (recursive(s + 1, sn - 1, p + 1, pn - 1)) return true;
    36         }
    37     }
    38 };

    今天看了Leetcode上1337的代码真是羞愧啊。http://leetcode.com/2011/09/regular-expression-matching.html

    重写了一遍。思路还是一样。

     1 class Solution {
     2 public:
     3     bool isMatch(const char *s, const char *p) {
     4         if (*p == '') return (*s == '');
     5         // match single '', '.', 'a'...
     6         if (*(p + 1) != '*') { 
     7             return ((*s == *p || (*p == '.' && *s != '')) && isMatch(s + 1, p + 1));
     8         }
     9         
    10         // match a*, .*
    11         while ((*s == *p || (*p == '.' && *s != ''))) {
    12             if (isMatch(s++, p + 2)) return true;
    13         }
    14         
    15         // ignore a*, *p != '.' && *s != *p
    16         return isMatch(s, p + 2);
    17     }
    18 };
  • 相关阅读:
    Angular2.0的学习(四)
    JAVA 中BIO,NIO,AIO的理解
    分布式调用技术 RPC VS REST
    深入浅出单实例Singleton设计模式
    接口设计六大原则
    线程安全的简单理解
    class<T>和 class<?>类型 有什么区别
    随笔记录
    问题记录总结
    JDK1.8 新特性(全)
  • 原文地址:https://www.cnblogs.com/linyx/p/3713825.html
Copyright © 2011-2022 走看看