19 正则表达式匹配
题目
请实现一个函数用来匹配包括
.
和*
的正则表达式。模式中的字符.
表示任意一个字符,而*
表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
例如,字符串aaa
与模式a.a
和ab*ac*a
匹配,但是与aa.a
和ab*a
均不匹配。
C 语言题解
题目中说的出现0次,例如ab*aa
若*
代表出现0次的话,则表示为字符串aaa
。
- 字符串和模式串都为空,返回true。
- 字符串不为空,模式串为空则返回false。
- 字符串为空,模式串不为空,还是有可能匹配成功的,比如模式串是
a*a*a*a*
,由于*
之前的元素可以出现0次,所以有可能匹配成功。 - 当模式中的第二个字符不是
*
时:- 如果字符串第一个字符和模式中的第一个字符匹配,那么字符串和模式都后移一个字符,继续匹配。
- 如果字符串第一个字符和模式中的第一个字符不匹配,直接返回false。
- 当模式中的第二个字符是
*
时:- 当
*
匹配0个字符时,模式串后移两位,越过*
,字符串位置不变; - 当
*
匹配多个字符时,模式串位置不变,字符串后移一位;当*
匹配一个字符时,由于字符串移到了下一个字符,而模式串字符不变,所以就需要模式串继续向后移动两个位置,越过*
,比如aaa
和a*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