表达式的匹配(13)

题一:正则表达式的匹配

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

1、分析:

(1)、当模式为 ' . '时,表示任意字符。只要该字符前面的字符能匹配,且该字符匹配时,字符串不是末尾,即可匹配成功。

(2)、当模式为 ' * '时,此时可以有三种可能的情况:该模式与字符串的对应字符匹配0次、1次、多次(大于1)。

2、代码如下

class Solution {
public:
    bool match(char* str, char* pattern)
    {
        if(str==nullptr||pattern==nullptr)
            return false;
        return matchElem(str,pattern);
    }
    
    bool matchElem(char* str,char* pattern)
    {
        //字符串和匹配模式都指向结束的时候,表示所有匹配成功
        if(*str=='\0' && *pattern=='\0')
            return true;
        //当匹配模式结束,而字符串未结束时,匹配失败
        if(*pattern=='\0'&&*str!='\0')
            return false;
        //当匹配模式的下一个字符为*时,有两种情况
        if(*(pattern+1)=='*')
        {
            //如果当前字符和模式字符匹配,或当前模式字符为任意字符且当前字符串字符不为结尾
            if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
            {
                return matchElem(str+1,pattern+2) //都是下一个字符进行匹配,此时只匹配一次
                    ||matchElem(str+1,pattern) //字符串下一个字符和模式字符继续进行匹配,此时为匹配多次
                    ||matchElem(str,pattern+2); //字符串当前字符和模式字符的下下个进行匹配,此时为匹配0次
            }
            else
            {
                //字符串当前字符和模式字符不能进行匹配,则直接匹配0次
                //将模式字符后面的字符继续进行匹配
                return matchElem(str,pattern+2);
            }
        }
        //如果当前字符和模式字符能匹配,则继续将它们各自的下一个进行匹配
        if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
            return matchElem(str+1,pattern+1);
        return false;
    }
};

题二:表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是

1、分析:判读一个字符串是数值时,有如下几点:

  • 首先判断小数点前面的字符是否为‘0’~‘9’之间的字符
  • 如果是,则在字符串上向后移动一个字符,继续判断。当遇到小数点字符时,表示后面可能是小数部分。
  • 如果是,则继续向后移动,当遇到 'e' 或 'E' 时,再判断其是否为指数部分。

2、代码如下:

class Solution {
public:
    bool isNumeric(char* string)
    {
        if(string==nullptr)
            return false;
        // 判断整数部分
        bool isNumber=ScanInt(&string);
        if(*string=='.')
        {
            ++string;
            /*
            判断小数部分:用或的原因:
            1、小数可能没有整数部分:.123,
            2、小数点后面没有数字:66.0,66
            3、既有整数又有小数:66.88
            */
            isNumber=ScanUnsignInt(&string)||isNumber;
        }
        if(*string=='e'||*string=='E')
        {
            ++string;
            /*
            判断指数部分,用且的原因:
            1、e或E前面没有数字时,整个字符串不能表示数字:.e6
            2、e或E后面必须要有整数,可以为负。
            */
            isNumber=ScanInt(&string)&&isNumber;
        }
        return isNumber && *string=='\0';
    }
    
    bool ScanUnsignInt(char** str)
    {
        char* start=*str;
        //判断字符是否为0~9之间的数字
        while(**str!='\0' && **str>='0' && **str<='9')
        {
            ++(*str);
        }
        return *str>start;
    }
    
    bool ScanInt(char** str)
    {
        if(**str=='+'||**str=='-')
            ++(*str);
        return ScanUnsignInt(str);
    }

};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值