您的位置:首页 > 其它

Regular Expression Matching

2014-09-26 09:11 183 查看
Implement regular expression matching with support for '.' and '*'.

'.' Matches any single character. '*' Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

The function prototype should be:

bool isMatch(const char *s, const char *p)

Some examples:

isMatch("aa","a") → false

isMatch("aa","aa") → true

isMatch("aaa","aa") → false

isMatch("aa", "a*") → true

isMatch("aa", ".*") → true

isMatch("ab", ".*") → true

isMatch("aab", "c*a*b") → true

注意:这里的a*表示a可以重复0次或者多次,不是a和*分开的。

思路:

待匹配串为S,匹配串为P。

简化问题,假设P中没有'*',那么我们只需要一位一位的比较S和P。
回到原问题,对于S[i]和P[j]:

如果P[j+1]!='*',S[i] == P[j]=>匹配下一位(i+1, j+1),S[i]!=P[j]=>return false;

如果P[j+1]=='*',如果p下一个是'*',那么(i+1,j),(i+1,j+2)都不匹配,则return false.如果匹配,看s下一个是否匹配。P排除‘*’,从j开始再数ai个,如果都不能匹配,则return false.如果超过了P的长度,则return false.

#include <iostream>
using namespace std;

bool reqularMatch(string s,string p)
{
for(int i=0;i<s.length();i++)
{
for(int j=0;j<p.length();j++)
{
if(s[i] == p[j])
{
int m =i+1,n=j+1;
while(m<s.length()&&n<p.length())
{
if(p
!= '*')
{
//如果下一个不是‘*’
if(p
== '.' || s[m] == p
)
{
m++;
n++;
}
else
{
return false;
}
}
else
{
//如果p下一个是'*',那么(i+1,j),(i+1,j+2)都不匹配,则return false.
//如果匹配,看s下一个是否匹配。P排除‘*’,从j开始再数ai个,如果都不能匹配,则return false.如果超过了P的长度,则return false.
int ai = m-i+1;
int aj = 0;
int w = j;
while(s[m]!=p[w]&&aj<=ai)
{
if(p[w]=='*')
{
w++;
if(w==p.length()) return false;
continue;
}
aj++;
w++;
if(w==p.length()) return false;
}

if(ai == aj)
{
return false;
}
m++;
}
}

}
}
}
return true;
}

void main()
{
string s= "ab";
string p= "c*ab*";
bool flag = reqularMatch(s,p);
printf("%s",flag?"Match!\n":"Not match!\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: