154. Coincidencia de expresiones regulares
La implementación admite la coincidencia de expresiones regulares de '.' Y '*'.
'.' coincide con cualquier letra.
'*' coincide con cero o más elementos precedentes.
La coincidencia debe cubrir toda la cadena de entrada, no solo una parte.
La función a implementar es: bool isMatch (string s, string p)
isMatch ("aa", "a") → falso
isMatch ("aa", "aa") → verdadero
isMatch ("aaa", "aa") → falso
isMatch ("aa", "a *") → verdadero
isMatch ("aa", ". *") → verdadero
isMatch ("ab", ". *") → verdadero
isMatch ("aab", "c * a * b") → verdadero
样例
Ejemplo 1:
Entrada: "aa", "a"
Salida: falsa
Explicación:
No se puede coincidir
Ejemplo 2:
Entrada: "aa", "a *"
Salida: verdadera
Explicación:
'*' puede repetir una
bool isMatch (string & s, string & p)
{ // escriba su código aquí 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;
}
más si (j + 2 <dstLen && p [j] == '.' && p [j + 1] == '*' && srcLen == 2 && dstLen> 2 && p [j + 2]! = ' * ')
{ devolver falso;
}
else if (p [j] == '.' && p [j + 1] == '*')
{ if (s [i] == s [i + 1]) { while (s [i] = = s [i + 1]) { i ++; } i ++; j = j + 2; } más si (s [i]! = s [i + 1] && s [i]! = p [j + 2]) { j = j + 2; i = i + 1; } más { j = j + 2; // 把. * 当作 0 处理 } } else if (p [j] == '.'
{ i ++; j ++; } más si (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;
{ devuelve verdadero; } } } más si (s [i] == p [j]) { i ++; j ++; } más si (j == dstLen - 1 && i == srcLen - 1 && s [i]! = p [j] && p [j]! = '*' && p [j]! = '.') { falso retorno; } más si (i == srcLen) { si (p [j] == '*'
devuelve verdadero;
}
}
}
}
else if (p [j] == '*')
{ if (s [i] == s [i - 1]) { while (i + 1 <srcLen && s [i] == s [ i + 1]) { i ++; } i ++; j ++; } más si (j + 1 <dstLen) // 把 * 前面 当作 0 个 { j = j + 1; } más si (p [j + 1]! = s [i - 1]) {
falso retorno;
}
más
{ j = j + 1; } } else { devolver falso; }
}
if (j <dstLen - 1)
{ devuelve falso; }
devuelve verdadero;
}
prueba void ()
{ / * cadena s = "aaaab"; cadena p = "a * a * a * a * c"; * /
// cadena s = "aa";
// cadena p = "a *";
// cadena s = "bbabacccbcbbcaaab";
// cadena p = "a * b * a * a * c * aa * c * bc *";
/ * cadena s = "ab";
cadena p = ". * c";
* /
// cadena s = "bbbba";
// cadena p = ". * a * a";
// cadena s = "acaabbaccbbacaabbbb";
// cadena p = "a *. * b *. * a * aa * a *";
cadena s = "aasdfasdfasdfasdfas";
cadena p = "aasdf. * asdf. * asdf. * asdf. * s";
bool ret = isMatch (s, p);
}