一、题目描述
实现正则表达式匹配,支持'.' 和'*';
- ‘.’:匹配任何单个字符。
- '*':匹配零个或多个前面的元素。
匹配应覆盖整个输入字符串(不是部分)。
函数原型应该是:bool isMatch(char* s, char* p)
s可以是空的并且只包含小写字母a-z。
p可以是空的并且只包含小写字母a-z和字符.要么*。
二、题意分析
Input:
s = "mississippi"
p = "mis*is*p*."
Output: false
“.”是指匹配任意“一个”字符;
“*”是指匹配任意“多个”p中“*”前面出现的字符,上例中,mis*i的“*”指它前面的字符s可以出现多次,但是匹配多次后,后面一定要有i或者.才能匹配。
三、解题算法
/***********************************
Author:tmw
date:2018-5-4
***********************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/**递归方法 时间复杂度O(n) 空间复杂度O(1) **/
bool isMatch(char* s, char* p) /**s为文本串,p为匹配串,判定p是否正则匹配s**/
{
if( *p == '\0') return *s == '\0';
/**当前p的下一个元素不是"*"时,则必须一一匹配**/
if( *(p+1) != '*' )
{
/**判定一一匹配的情况,把.考虑在内**/
if( *p == *s || (*p == '.' && *s != '\0') )
return isMatch( s+1, p+1 );
else
return false;
}
/**当前p的下一个元素是“*”时,在跳过当前s位置上重复当前p位置上元素的元素**/
else
{
while( *p == *s || (*p == '.' && *s != '\0') )
{
/**【特殊情况】
当s位置上的元素与p+2位置上的元素匹配时,说明p位置上元素与p+2位置上元素相同
则应该把p+2位置上的元素也包括在“*”中任意元素任意个数中的一个,否则会返回错误
【例如】
s="aaa"
p="a*a"
若不加这个判断,*会把s中所有的a匹配完直到s=='\0',但此时p还有一个a,程序会返回false
实际上这个*后面的a应该算成*中任意个数的其中一个,那么就变成了s=='\0'&&p=='\0',返回true
**/
if( isMatch( s, p+2 ) )
return true;
s++;
}
return isMatch(s,p+2);
}
}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~~~