Requisitos de la asignatura
toda la idea
Principalmente me dividí en cuatro situaciones para hacerlo:
- .
- . *
- X
- X*
Los dos primeros tipos comienzan con '.', Los dos últimos comienzan con x. Juzga cada situación por separado.
Para los dos casos de '.' Y'x ', es fácil juzgar directamente si syp son iguales.
Para los dos casos con '*', adopté un método recursivo. Porque no se sabe cuántos de los mismos caracteres en s deben ser "tragados" por la expresión de cierre en p. Entonces hago una autorrecursión cada vez que muevo el puntero de s. Vuelva a pasar la subcadena de sy la subcadena de p a la función para el juicio recursivo, devuelva verdadero si es factible y mueva el puntero de s hacia adelante para continuar el juicio si no es factible.
Un poco similar al método de análisis de descenso recursivo en el análisis de sintaxis del principio de compilación:
preste atención a los tres pasos de c, dye en la figura anterior, que muestran cómo retroceder después de una coincidencia incorrecta
Código
bool isMatch(string &s, string &p)
{
int indexS = 0, indexP = 0;
string substrS, substrP;
while (indexP < p.size() && indexS < s.size())
{
if (p[indexP] == '.')
{
// .*
if (indexP+1 < p.size() && p[indexP+1] == '*')
{
substrP = p.substr(indexP + 2, p.size() - indexP - 2);
while (indexS < s.size())
{
substrS = s.substr(indexS, s.size() - indexS);
if (isMatch(substrS, substrP))
{
return true;
}
++indexS;
}
indexP += 2;
}
//.
else
{
++indexP;
++indexS;
}
}
else
{
//x*
if (indexP+1 < p.size() && p[indexP + 1] == '*')
{
if (indexP + 2 >= p.size())
{
substrP = "";
}
else
substrP = p.substr(indexP+2, p.size() - indexP - 2);
while (indexS < s.size() && s[indexS] == p[indexP])
{
substrS = s.substr(indexS, s.size() - indexS);
if (isMatch(substrS, substrP))
{
return true;
}
++indexS;
}
indexP += 2;
}
//x
else
{
if (p[indexP++] != s[indexS++])
{
return false;
}
}
}
}
if (indexS == s.size() && indexP == p.size())
{
return true;
}
else
{
if (indexP < p.size())
{
while (indexP < p.size())
{
//尾部剩余闭包表达式
if (indexP+1 < p.size() && p[indexP + 1] == '*')
{
indexP += 2;
}
else
return false;
}
return true;
}
else
return false;
}
}
Que aprendí
1. Cuando necesite obtener el valor del índice + 1 en la matriz, primero debe determinar si el índice + 1 está fuera de rango.
2. Utilice la función de cadena substr para obtener la subcadena que comienza con index:
str.substr(index, str.size()-index);
3. Cuando utilice el incremento o decremento automático en la condición de juicio de bucle, debe tener en cuenta: si el programa no atraviesa ni siquiera un ciclo, si la operación de incremento o decremento automático es razonable