19 正则表达式匹配

题目

请实现一个函数用来匹配包括.*的正则表达式。模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串aaa与模式a.aab*ac*a匹配,但是与aa.aab*a均不匹配。

牛客网 OJ
AcWing

C 语言题解

题目中说的出现0次,例如ab*aa*代表出现0次的话,则表示为字符串aaa

  • 字符串和模式串都为空,返回true。
  • 字符串不为空,模式串为空则返回false。
  • 字符串为空,模式串不为空,还是有可能匹配成功的,比如模式串是a*a*a*a*,由于*之前的元素可以出现0次,所以有可能匹配成功。
  • 当模式中的第二个字符不是*时:
    • 如果字符串第一个字符和模式中的第一个字符匹配,那么字符串和模式都后移一个字符,继续匹配。
    • 如果字符串第一个字符和模式中的第一个字符不匹配,直接返回false。
  • 当模式中的第二个字符是*时:
    • *匹配0个字符时,模式串后移两位,越过*,字符串位置不变;
    • *匹配多个字符时,模式串位置不变,字符串后移一位;当*匹配一个字符时,由于字符串移到了下一个字符,而模式串字符不变,所以就需要模式串继续向后移动两个位置,越过*,比如aaaa*a的匹配
class Solution {
public:
    bool match(char* str, char* pattern)
    {
        // 字符串和模式串都为空,返回true
        if(*str == '\0' && *pattern == '\0')
            return true;
        
        //字符串非空,但是模式串为空,返回false
        if(*str != '\0' && *pattern == '\0')
            return false;
        
        // 模式串的下一个字符是'*'
        if(*(pattern+1) == '*')
        {   
           //如果当前字符匹配,或者字符串非空,模式串当前的字符是'.'
           if(*(pattern) == *(str) || ((*str) != '\0' && *(pattern) == '.'))
               // 如果'*'重复前面的字符1次或者多次,那么字符串后移一个位置,模式串保持不变
               // 如果'*'仅仅匹配1次,字符串移动到下一个位置,那么就需要模式串后移两两个位置
               return match(str+1, pattern)|| match(str, pattern+2);
            //当前字符不匹配,说明'*'必须是重复0次,模式串后移位置两个跳过'*'
            else
                return match(str,pattern+2);
        }
        //模式串下一个字符不是'*'
        else
        {
            //如果当前字符匹配,或者字符串非空,模式串当前的字符是'.',则继续匹配
            if(*(pattern) == *(str) || ((*str) != '\0' && *(pattern) == '.'))
                return match(str+1,pattern+1);
            // 当前字符不匹配,直接返回false
            else
                return false;
        }      
    }
};

C++ 题解

python 题解

# -*- coding:utf-8 -*-
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        # write code here
        # 区别C语言字符数组中以'\0'标识字符串结尾,
        # python 直接统计字符串长度
        if len(s) == 0 and  len(pattern) == 0:
            return True
        
        if len(s) > 0 and len(pattern) == 0:
            return False
        
        # 一定要先判断 == '*'的情况,并且前提是模式串长度大于等于2
        if len(pattern) > 1 and pattern[1] == '*':
            if len(s) > 0 and (s[0] == pattern[0] or pattern[0] == '.'):
                return self.match(s[1:],pattern) or self.match(s,pattern[2:])
            else:
                return self.match(s,pattern[2:])
        else:
            if len(s) > 0 and (s[0] == pattern[0] or pattern[0] == '.'):
                return self.match(s[1:],pattern[1:])
            else:
                return False           
posted @ 2019-03-01 09:06  youngliu91  阅读(451)  评论(0编辑  收藏  举报