Created
March 15, 2013 16:03
-
-
Save manuerumx/5170977 to your computer and use it in GitHub Desktop.
VB6 Boyer-Moore implementation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Function Busca_Boyer_Moore(CadenaBuscar As String, CadenaBuscarEn As String, Optional Inicio As Double = 1) As Double | |
Dim x As Integer | |
Dim Y As Integer | |
Dim intPoscLC As Double | |
Dim intPoscFin As Double | |
Dim intLenCadBus As Double | |
Dim intLenCadBusE As Double | |
Dim strCaracter() As String | |
Dim blnMatch As Boolean | |
'Iniciamos las variables | |
'Determina el Caracter de arranque o la ultima coincidencia encontrada | |
intPoscLC = Inicio | |
'Es de donde inciaremos si no coincide la cadena | |
intPoscFin = Inicio | |
'Determina si se encontro o no. | |
blnMatch = False | |
'Longitud de la cadena a buscar | |
intLenCadBus = Len(CadenaBuscar) | |
'Longitud de la cadena en la que se buscara | |
intLenCadBusE = Len(CadenaBuscarEn) | |
'Redimensionamos la variable para almacenar cada caracter de la cadena a buscar | |
ReDim strCaracter(intLenCadBus) As String | |
'Asignamos cada caracter a la variable que redimensionamos | |
For x = 1 To intLenCadBus | |
strCaracter(x) = Mid(CadenaBuscar, x, 1) | |
Next x | |
'Hasta que no se cumpla la condición de que se encontro la cadena hacemos un Ciclo | |
Do Until blnMatch = True | |
'Determinamos la posición de la primera coincidencia del Ultimo caracter de nuestra cadena | |
'que estamos buscando | |
intPoscFin = InStr(intPoscLC, CadenaBuscarEn, strCaracter(intLenCadBus)) | |
'Si esta la posición de la ultima coincidencia es mayor a 1 y la posición del caracter inmediato | |
'es 0 entonces, ya recorrimos toda la cadena en la que buscamos y salimos de la función. | |
'esto permite que no nos quedemos en un ciclo infinito. | |
If intPoscLC >= 1 And intPoscFin = 0 Then | |
Busca_Boyer_Moore = 0 | |
Exit Function | |
End If | |
'Determinamos la posición del inicio de nuestra busqueda a partir de la ultima coincidencia encontrada | |
'esto por si no toda la cadena se encuentra. | |
intPoscLC = intPoscFin + 1 | |
'Si esta posición es menor al tamaño de la cadena que buscamos significa que estamos al incio | |
' de la cadena y no podemos buscar el resto de los caracteres antes de esta posición. | |
If intPoscFin < intLenCadBus Then GoTo Sig | |
'Si el primer caracter de nuestra cadena no coincide nos brincamos para encontrar la siguiente | |
'coincidencia | |
If Mid(CadenaBuscarEn, (intPoscFin - intLenCadBus) + 1, 1) <> strCaracter(1) Then GoTo Sig | |
'Aqui recorremos cada caracter en un orden inverso de Derecha a Izquierda y vemos si coincide nuestra | |
'cadena | |
For x = intLenCadBus To 1 Step -1 | |
'Variable para determinar la posición de la cadena a comparar | |
Y = (intLenCadBus - x) | |
If Mid(CadenaBuscarEn, (intPoscFin - Y), 1) = strCaracter(x) Then | |
'Se encuentra, vamos por buen camino. :D | |
blnMatch = True | |
'Esto esta mal, siempre devuelve 0 cuando hay coincidencias en busquedas menores a 4 caracteres | |
Busca_Boyer_Moore = 1 '(intPoscFin - intLenCadBus) | |
Else | |
'No se encuentra, a seguir buscando | |
Busca_Boyer_Moore = 0 | |
blnMatch = False | |
Exit For | |
End If | |
Next x | |
Sig: | |
Loop | |
End Function |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment