正则表达式匹配(递归+剑指offer)
2015-11-02 18:04
393 查看
正则表达式匹配
参与人数:660时间限制:1秒空间限制:32768K
通过比例:14.97%
最佳记录:0 ms|8552K(来自 高鹏)
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
链接:http://www.nowcoder.com/practice/45327ae22b7b413ea21df13ee7d6429c?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题意:点可以表示任意字符,星*表示前一个字符可以出现0--n次,那么用递归来解,条件是str串和pattern串到达结尾,或者str串结尾了,pattern串没有结尾,都退出。
而递归的条件是:遇到*,则三个出口,(str+1,pattern+2),(str+1,pattern+2),(str,pattern+2),(str+1,pattern);
遇到'.' (str+1,pattern+1);
#include<cstdio>
using namespace std;
class Solution {
public:
bool match(char* str, char* pattern)
{
// puts(str);
// puts(pattern);
if(str==NULL && pattern==NULL)
return true;
if(str==NULL || pattern==NULL)
return false;
return matchCore(str,pattern);
}
bool matchCore(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'))
{
//move on the next state
return matchCore(str+1,pattern+2)
//stay on the current state
|| matchCore(str+1,pattern)
//ignore a '*'
|| matchCore(str,pattern+2);
}
else return matchCore(str,pattern+2);
}
if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
{
return matchCore(str+1,pattern+1);
}
return false;
}
};
int main()
{
char ch1[]="";
char ga1[]="";
char *ch=ch1;
char *ga=ga1;
Solution so;
if(so.match(ch,ga))printf("true\n");
else printf("false\n");
return 0;
}
参与人数:660时间限制:1秒空间限制:32768K
通过比例:14.97%
最佳记录:0 ms|8552K(来自 高鹏)
题目描述
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配链接:http://www.nowcoder.com/practice/45327ae22b7b413ea21df13ee7d6429c?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题意:点可以表示任意字符,星*表示前一个字符可以出现0--n次,那么用递归来解,条件是str串和pattern串到达结尾,或者str串结尾了,pattern串没有结尾,都退出。
而递归的条件是:遇到*,则三个出口,(str+1,pattern+2),(str+1,pattern+2),(str,pattern+2),(str+1,pattern);
遇到'.' (str+1,pattern+1);
#include<cstdio>
using namespace std;
class Solution {
public:
bool match(char* str, char* pattern)
{
// puts(str);
// puts(pattern);
if(str==NULL && pattern==NULL)
return true;
if(str==NULL || pattern==NULL)
return false;
return matchCore(str,pattern);
}
bool matchCore(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'))
{
//move on the next state
return matchCore(str+1,pattern+2)
//stay on the current state
|| matchCore(str+1,pattern)
//ignore a '*'
|| matchCore(str,pattern+2);
}
else return matchCore(str,pattern+2);
}
if(*str==*pattern||(*pattern=='.'&&*str!='\0'))
{
return matchCore(str+1,pattern+1);
}
return false;
}
};
int main()
{
char ch1[]="";
char ga1[]="";
char *ch=ch1;
char *ga=ga1;
Solution so;
if(so.match(ch,ga))printf("true\n");
else printf("false\n");
return 0;
}
相关文章推荐
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#中的尾递归与Continuation详解
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- Javascript递归打印Document层次关系实例分析
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件
- JavaScript的递归之递归与循环示例介绍
- C# 递归查找树状目录实现方法
- c#使用正则表达式匹配字符串验证URL示例
- 全排列算法的非递归实现与递归实现的方法(C++)
- php递归列出所有文件和目录的代码
- java递归菜单树转换成pojo对象
- 一个JavaScript递归实现反转数组字符串的实例
- Java中的递归详解(用递归实现99乘法表来讲解)
- C语言的递归思想实例分析
- php通过递归方式复制目录和子目录的方法