剑指offer19--正则表达式匹配

题目描述

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

思路:

  1. 空字符串---false
  2. 第二个字符串不是*
    1. 判断是否相等,相等就都往后挪
    2. 不想等的话,判断是否有 "." ,如果有的话,判断str是否到了
  3. 第二个模式+1是*
    1. 判断是不是相等||模式是否有 "." ,str是否到了----str+1(跳过这个字符串,模式不变) || pattern+2(跳过这个模式X*,字符串不变)
    2. else 直接跳过这个模式,字符串不变
class Solution {
public:
    bool matchfunc(char *str,char * pattern)
    {
        if(*str=='\0'&&*pattern=='\0')
            return true;
        if(*str!='\0'&&*pattern=='\0')
            return false;
        if(*(pattern+1)=='*')
        {
            if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
                return matchfunc(str+1,pattern)||matchfunc(str,pattern+2);//str的.  和   pattern的b*抵消了。
            else//不相等也没有.
                return matchfunc(str,pattern+2);
        }
        else
        {
            if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
                return matchfunc(str+1,pattern+1);
        }
        return false;
    }

    bool match(char *str,char * pattern)
    {
        if(str==NULL||pattern==NULL)
            return false;
        return matchfunc(str,pattern);
    }
};

感觉题目还是有问题,如果出现   .*   这种正则表达式呢?

我测试了发现不对,识别不出来到底对还是错。  

 char *str="abaaa";
 char *pattern="a.*";

调试代码:

#include <iostream>

using namespace std;

bool matchfunc(char *str,char * pattern)
{
	if(*str=='\0'&&*pattern=='\0')
		return true;
	if(*str!='\0'&&*pattern=='\0')
		return false;

	if(*(pattern+1)=='*')
	{
		if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
			return matchfunc(str+1,pattern)||matchfunc(str,pattern+2);//str的.  和   pattern的b*抵消了。
		else//不相等也没有.
			return matchfunc(str,pattern+2);
	}
	else
	{
		if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
			return matchfunc(str+1,pattern+1);
	}
	return false;
}

bool match(char *str,char * pattern)
{
	if(str==NULL||pattern==NULL)
		return false;
	return matchfunc(str,pattern);
}

int main()
{
	char *str="abaaa";
	//char *pattern="ab*ac*a";
	char *pattern="a.*";
	int Res=match(str,pattern);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37561165/article/details/81507936