Dadas dos cadenas de longitud N, ¿cómo encuentro la ventana máxima de patrones coincidentes si pueden mutarse?

Sean S [1 … N] y T [1 … N] las dos cadenas. Defina la cuenta [i] [j] como la diferencia entre el número de ocurrencias del carácter j en S [1 … i] y T [1 … i]. Es fácil ver que [l … r] es una ventana válida iff count [l-1] [j] = count [r] [j] para todo j. Si se ha calculado el recuento [i] [j] para todos los j, el recuento [i + 1] [k] se puede calcular en el tiempo O (1) ya que solo los valores para el recuento [i] [S [i]] y el recuento [i] [T [i]] necesita ser actualizado. Una vez que se ha calculado el recuento [i] [*], encuentre la i ‘más temprana para la cual recuento [i’] [*] = recuento [i] [*]. [i ‘+ 1 … i] es la ventana válida más larga con i como el elemento correcto. Repitiendo este paso para todo lo que da la solución requerida.

El almacenamiento de todos los valores de recuento [i] [*] que se han visto hasta ahora puede hacerse con hashing o con alguna estructura de datos como un conjunto. Para este problema en particular, la clasificación también funcionaría. La complejidad general sería O (N) u O (NK) u O (NK log N) (donde K es el tamaño del alfabeto) dependiendo de la implementación exacta.

// asumiendo que la secuencia no contiene caracteres duplicados

max_window_size = -1
maxw_commonseq = -1

para cada char ‘c’ en seq1 {
i = posición de ‘c’ en seq1
x = posición de ‘c’ en seq2

si (x <0) continúa;

para wsize = x a 2 {
seq1_w [0] = (i-wsize + 1) <0? 0: (i-wsize + 1)
seq2_w [0] = (x-wsize + 1) <0? 0: (x-wsize + 1)

sa = ordenar ‘a’ desde las posiciones seq1_w [0] a seq1_w [1]
sb = ordenar ‘b’ desde las posiciones seq2_w [0] a seq2_w [1]

if (wsize> maxw_commonseq) {
maxw_commonseq = max_perm_seq_in (sa, sb, seq1_w [0], seq2_w [0], wsize, maxw_commonseq)
}
}
}

max_perm_seq_in (a, b, awindow, bwindow, wsize, maxseqw) {
if (awindow <0 || bwindow <0 || awindow + wsize> n || bwindow + x> n) devuelve maxseqw
if (awindow + wsize

para i = awindow, j = bwindow a (i + awindow if (a ! = a [j]) {
return max (max_perm_seq (a, b, awindow + 1, bwindow, wsize, maxseqw),
max_perm_seq (a, b, awindow, bwindow + 1, wsize, maxseqw))
} continuar;
}
return x + awindow
}

Compartir esta solución O (n) con la implementación de Python

Subcadena de coincidencia más larga, independientemente del orden de los caracteres

para el ejemplo que has dado esto funcionará.
Ordene las cadenas y verifique que la subcadena más larga de longitud diga K. La complejidad general será O (nlogn) + O (K) = O (nlogn)

More Interesting

¿Qué algoritmos y estructuras de datos se pueden usar para encontrar anagramas?

En la tercera edición de 'Introducción a los algoritmos', ¿por qué comprar acciones es un problema de subarrays máximos?

Algoritmos: ¿Cómo encuentro un elemento en una secuencia que sea más pequeño que mi número en la secuencia, a la izquierda de mi número y a la derecha de todos esos elementos?

¿Los algoritmos están sesgados inherentemente hacia las opiniones subjetivas de sus creadores humanos?

¿Cuál es la mejor función hash que está disponible para identificar cadenas de forma exclusiva?

¿Cuál es el significado de la complejidad en el algoritmo?

¿Hay algún caso donde alguien de alguna manera descifró el algoritmo y engañó en el IITJEE?

¿Existe un algoritmo para encontrar un árbol con una longitud de ruta mínima ponderada para un gráfico conectado genérico?

Cómo resolver http://www.spoj.com/problems/SAMER08A/ usando el algoritmo de Dijkstra

¿Cuál es el programa de clasificación rápida que tiene su mediana como pivote?

¿Qué es mejor en C #, mantener una variable con un tamaño de matriz o llamar a la longitud de la matriz?

Cómo tomar una matriz 1d y convertir la matriz en una matriz 2d en una función c ++ para que la matriz ahora sea 2d en main ()

CodeChef: ¿Está bien resolver los desafíos de programación sin el conocimiento de algoritmos?

¿Podemos implementar un algoritmo genético sin usar mutación?

Cómo enviar una matriz unidimensional a una función y tener esa misma matriz (posición en la memoria) convertida en una matriz bidimensional en C ++