1. Introducción al tema
Hay tres operaciones de edición para cadenas: insertar un carácter, eliminar un carácter o reemplazar un carácter. Dadas dos cadenas, escriba una función para determinar si requieren solo una (o cero) edición.
Ejemplo 1:
Entrada:
primero = "pálido"
segundo = "ple"
Salida: Verdadero
Ejemplo 2:
Entrada:
primero = "palidez"
segundo = "amigo"
Salida: Falso
Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/one-away-lcci
Copyright es propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.
Dos ideas para resolver problemas
Esta pregunta utiliza el método de doble puntero y los detalles son los siguientes:
- La diferencia entre la longitud de las dos cadenas no puede ser mayor que 1.
- Cuando primero [i] == segundo [j], luego i ++, j ++.
- Cuando primero [i]! = Segundo [j], si primero [i + 1] == segundo [j], luego i ++, cuenta ++ (tiempos de edición); si primero [i] == segundo [j + 1], Luego j ++, count ++; es decir, puede eliminar un carácter para hacer dos cadenas iguales.
- En otros casos, i ++, j ++, count ++, puede insertar o reemplazar un carácter para que las dos cadenas sean iguales.
- Finalmente, cuando un puntero en ioj apunta al final de la primera o segunda cadena, cuente el valor de max (first.size () - i, second.size () - j) + count, y devuelva verdadero si es menor o igual a 1. De lo contrario, devuelve falso.
Tres, código de resolución de problemas
class Solution {
public:
bool oneEditAway(string first, string second) {
int len1 = first.size();
int len2 = second.size();
if(abs(len1-len2) > 1)
return false;
int i = 0, j = 0;
int count = 0;
while(i < len1 && j < len2)
{
if(first[i] == second[j])
{
++i;
++j;
}
else
{
//删除一个字符
if(first[i+1] == second[j])
++i;
//删除一个字符
else if(first[i] == second[j+1])
++j;
//插入一个字符,或者替换一个字符
else
{
++i;
++j;
}
++count;
}
}
if(max(len1-i, len2-j)+count > 1)//当某一个指针先到达字符串结尾时,即两个字符串长度不一致的情况
return false;
return true;
}
};