题一:正则表达式的匹配
【请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含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);
}
};