Algoritmo de coincidencia de cadenas KMP de análisis de casos

Recientemente, encontré un algoritmo de coincidencia de cadenas en Likou. Aunque algunas soluciones son simples, el algoritmo de coincidencia de cadenas KMP se puede utilizar para mejorar la eficiencia. Las preguntas específicas son las siguientes

Dadas dos cadenas, A y B.

La operación de rotación de A es mover el carácter más a la izquierda de A hacia la derecha. Por ejemplo, si A = 'abcde', el resultado será 'bcdea' después de un movimiento. Si después de varias rotaciones, A puede convertirse en B, devuelve True.

Ejemplo 1:
Entrada: A = 'abcde', B = 'cdeab'
Salida: verdadera

Ejemplo 2:
Entrada: A = 'abcde', B = 'abced'
Salida: falso

Nota: La
    longitud de A y B no supera los 100.

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/rotate-string

Al principio, usé la coincidencia directa, pero a partir de las respuestas vi que algunas personas usaban el algoritmo KMP, explicaré el algoritmo KMP a continuación.

Consulte la explicación del video https://www.bilibili.com/video/BV1Px411z7Yo

 

Como se muestra en la figura anterior, para encontrar la subsecuencia que coincida con la cadena P en la cadena T

Si emparejas directamente, debes emparejar uno por uno. Cuando la cuarta cuerda b en p no coincide con a en T, p se mueve hacia atrás una posición y continúa emparejando, lo cual es muy problemático.

Especialmente en las siguientes situaciones, el algoritmo es el peor en este caso.

El algoritmo KMP primero debe enumerar los prefijos de las cadenas que se van a hacer coincidir y luego tratarlas como cadenas independientes.

Luego, averigüe el prefijo más largo y el sufijo más largo de estas cadenas, por ejemplo, como se muestra en la siguiente figura.

Se encuentra que el prefijo más largo y el sufijo más largo son diferentes, y luego las longitudes del prefijo y sufijo deben restarse en un bit respectivamente, y se encuentra que el prefijo y el sufijo coinciden en este momento, y ambos son ab.

Enumere sus prefijos y sufijos públicos más grandes por separado

Generalmente, cuando se comienza con cero, el último párrafo no es necesario, así que elimine el último párrafo y agregue un -1 en la parte superior.

Enumere esta columna de números como números de tabla de prefijos y corresponda a la cadena que se emparejará de adelante hacia atrás una por una

Luego, alinee la tabla de prefijos con la cadena que se va a emparejar y marque los subíndices de letras (los subíndices de letras comienzan desde 0). A continuación, estamos listos para combinar

Cuando el cuarto carácter no es el mismo, la coincidencia falla. Observe que el número en la tabla de prefijos es 1.

Alinee el carácter en la posición 1 en la cadena coincidente con el carácter que simplemente no coincidió y el subíndice es 1, como se muestra en la figura siguiente

Luego continúe haciendo coincidir desde la posición en la que la cadena simplemente no coincidió, y se encuentra que todavía no coincide, y el subíndice es 0 en este momento

Continúe el proceso ahora mismo, alinee la posición 0 de la cadena para que coincida con la posición que acaba de fallar

En este momento, la coincidencia es exitosa, y luego la coincidencia se realiza más tarde, y se encuentra que la coincidencia ha fallado (c no corresponde a a). En este momento, repita el proceso ahora y continúe buscando el subíndice de la tabla de prefijos de la posición fallida. En este momento, es 0, y se agrega el carácter 0. Alinear con eso

En este momento, a y c no coinciden. En este momento, la tabla de prefijos es -1 y el número -1 de la cadena que se va a emparejar está alineado (el número -1 no está en el

En la cadena, pero se puede representar agregando antes), que equivale a un bit en paralelo.

En este momento, el bit -1 está en blanco, no hay nada y luego el siguiente bit coincide

¡Luego empareje uno por uno hasta que el partido sea exitoso!

Sin embargo, debe tenerse en cuenta que a veces una cadena puede contener varias cadenas para hacer coincidir. En este momento, el último carácter de la cadena que debe coincidir comenzará a ejecutar el algoritmo con el carácter correspondiente en la tabla de prefijos, como se muestra a continuación. Mostrado:

¡Hasta que se complete la coincidencia, encuentra todas las cadenas que coincidan!

Supongo que te gusta

Origin blog.csdn.net/qq_44665418/article/details/105855228
Recomendado
Clasificación