Dada una lista de cadenas, ¿cómo puedo determinar si existe un orden de caracteres para el cual las cadenas están ordenadas en orden lexicográfico?

Lalit Kundu hace un buen trabajo explicando lo que hay que hacer. Solo me ampliaré en eso. Se nos da un conjunto de caracteres (llamado alfabeto ) y un conjunto de palabras (que son grupos de caracteres).

Dadas dos palabras de este conjunto [matemática] w_i [/ ​​matemática] y [matemática] w_j [/ matemática], y un orden entre ellas, siempre podemos encontrar una ordenación entre los diferentes caracteres en la misma posición de índice. Por lo tanto, dado [math] w_i <w_j [/ math], si este par difiere en los caracteres [math] c_i [/ ​​math] y [math] c_j [/ math], entonces el orden [math] c_i <c_j [/ se puede decir que math] forma un par ordenado válido [math] (c_i, c_j) [/ math].

Dados todos estos pares ordenados, nos quedan esencialmente dos problemas:

  1. ¿Cómo almacenamos estos pares ordenados de manera eficiente?
  2. ¿Cómo encontramos un orden válido entre todos los caracteres que forman cada uno de los pares ordenados (una vez que hayamos almacenado bien estos pares ordenados)?

El primer problema se resuelve fácilmente con un gráfico de dependencia. Lo haces incluyendo una arista dirigida desde [math] c_i [/ ​​math] a [math] c_j [/ math] para el par ordenado [math] (c_i, c_j) [/ math]. En esta etapa, si encuentra dos pares ordenados en conflicto (por ejemplo, [math] (a, b) [/ math] y [math] (b, a) [/ math]), se puede decir que un pedido válido no puede existen entre este par de personajes. El orden entre ellos es, por lo tanto, ambiguo y no puede incluirse de manera confiable en nuestro resultado. En este punto, puede elegir mantener cualquiera de los bordes (suponga que uno de los pares de pedidos es válido mientras que el otro no lo es) o eliminar ambos de su gráfico.

El segundo problema se resuelve ordenando topológicamente el gráfico que construyó para resolver su primer problema. El orden topológico le dará el orden correcto de los caracteres en su alfabeto dado que el gráfico de dependencia que construyó era válido.

La idea básica de la solución proviene de la observación. Veamos la lista formada tomando los primeros caracteres de cada una de las cadenas en la lista. Digamos que esta lista es [matemáticas] c_1, c_2, …, c_n [/ matemáticas]. Ahora, si [math] c_i \ ne c_ {i + 1} [/ math], eso significa [math] c_i

Seguimos almacenando toda esta información ( es decir, estas desigualdades). Esta es la información que tenemos al comparar los primeros caracteres. Ahora, podemos avanzar y comparar los segundos caracteres de esas cadenas cuyo primer carácter es el mismo. Pero suponiendo que exista un orden válido de caracteres, estos conjuntos de cadenas ocurrirán junto a la lista. Ahora, solo tenemos que resolver un nuevo subproblema de la misma forma.

Ejemplo, digamos que la lista inicial es [aa, aaa, b, ba, bc, c, cd, a, aa] . Comparando los primeros caracteres implicamos que a < b y b < c y c < a . En los próximos pasos, hacemos lo mismo para las listas [a, aa], [“”, a, c], [“”, d], [“”, a] , que se forman eliminando los primeros caracteres y acumulando esos cadenas adyacentes cuyo primer carácter fue el mismo.

Una vez que hemos creado esta lista de desigualdades, solo tenemos que verificar si existe un orden [matemática] c_1

Siéntase libre de comentar si necesita más detalles.