Entrevista al programador preguntas clásicas doradas de la entrevista 01.05. Edición única

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;
    }
};

Cuatro, resultados de resolución de problemas

Supongo que te gusta

Origin blog.csdn.net/qq_39661206/article/details/105628501
Recomendado
Clasificación