154. 正则表达式匹配
实现支持'.'和'*'的正则表达式匹配。
'.'匹配任意一个字母。
'*'匹配零个或者多个前面的元素。
匹配应该覆盖整个输入字符串,而不仅仅是一部分。
需要实现的函数是:bool isMatch(string s, string p)
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
样例
样例 1:
输入:"aa","a"
输出:false
解释:
无法匹配
样例 2:
输入:"aa","a*"
输出:true
解释:
'*' 可以重复 a
bool isMatch(string &s, string &p)
{
// write your code here
int srcLen = s.size();
int dstLen = p.size();
int i = 0;
int j = 0;
while (i < srcLen)
{
char aa = s[i];
char bb = p[j];
if (p[j] == '.' && p[j + 1] == '*' && dstLen == 2)
{
return true;
}
else if (j+2 < dstLen && p[j] == '.' && p[j + 1] == '*' && srcLen == 2 && dstLen > 2 && p[j + 2] != '*')
{
return false;
}
else if (p[j] == '.' && p[j + 1] == '*')
{
if (s[i] == s[i + 1])
{
while (s[i] == s[i + 1])
{
i++;
}
i++;
j = j + 2;
}
else if(s[i] != s[i + 1] && s[i] != p[j+2])
{
j = j + 2;
i = i + 1;
}
else
{
j = j + 2; //把 .* 当作 0处理
}
}
else if (p[j] == '.')
{
i++;
j++;
}
else if (s[i] != p[j] && j+1 < dstLen && p[j + 1] == '*')
{
j = j + 2;
}
else if (j == dstLen - 1 && i != srcLen - 1 && p[j ] != '*')
{
return false;
}
else if (j != dstLen - 1 && i == srcLen - 1)
{
if (j + 1 < dstLen)
{
while (j + 1 < dstLen && p[j + 1] == '*')
{
j = j + 2;
}
if (p[j] == s[i])
{
return true;
}
}
}
else if (s[i] == p[j])
{
i++;
j++;
}
else if (j == dstLen - 1 && i == srcLen - 1 && s[i] != p[j] && p[j] != '*' && p[j] != '.')
{
return false;
}
else if (i == srcLen)
{
if (p[j] == '*')
{
if (p[j - 1] == p[j + 1])
{
if (j + 1 == dstLen - 1)
{
return true;
}
}
}
}
else if (p[j] == '*')
{
if (s[i] == s[i - 1])
{
while (i+1 < srcLen && s[i] == s[i + 1])
{
i++;
}
i++;
j++;
}
else if (j + 1 < dstLen) //把 * 前面当作 0 个
{
j = j + 1;
}
else if (p[j + 1] != s[i - 1])
{
return false;
}
else
{
j = j + 1;
}
}
else
{
return false;
}
}
if (j < dstLen - 1)
{
return false;
}
return true;
}
void test()
{
/*
string s = "aaaab";
string p="a*a*a*a*c";*/
//string s = "aa";
//string p = "a*";
//string s = "bbabacccbcbbcaaab";
//string p = "a*b*a*a*c*aa*c*bc*";
/*string s = "ab";
string p = ".*c";
*/
//string s = "bbbba";
//string p = ".*a*a";
//string s = "acaabbaccbbacaabbbb";
//string p = "a*.*b*.*a*aa*a*";
string s = "aasdfasdfasdfasdfas";
string p = "aasdf.*asdf.*asdf.*asdf.*s";
bool ret = isMatch(s, p);
}