Generación de palabras Lyndon de longitud n

Dado un entero n y una array de caracteres S , la tarea es generar palabras Lyndon de longitud n que tengan caracteres de S .

Una palabra de Lyndon es una string que es estrictamente menor que todas sus rotaciones en orden lexicográfico. Por ejemplo, la string “012” es una palabra Lyndon ya que es menor que sus rotaciones “120” y “201”, pero “102” no es una palabra Lyndon ya que es mayor que su rotación “021”. Nota: “000” no se considera una palabra Lyndon ya que es igual a la string obtenida al rotarla.

Ejemplos:

Entrada: n = 2, S = {0, 1, 2} Salida: 01 02 12 Otras posibles strings de longitud 2 son «00», «11», «20», «21» y «22». Todos estos son mayores o iguales a una de sus rotaciones. Entrada: n = 1, S = {0, 1, 2} Salida: 0 1 2

Enfoque: existe un enfoque eficiente para generar palabras de Lyndon que fue proporcionado por Jean-Pierre Duval, que se puede usar para generar todas las palabras de Lyndon hasta una longitud n en el tiempo proporcional al número de dichas palabras. (Consulte el documento » Coste promedio del algoritmo de Duval para generar palabras de Lyndon » de Berstel et al. para ver la prueba) El algoritmo genera las palabras de Lyndon en un orden lexicográfico. Si w es una palabra de Lyndon, la siguiente palabra se obtiene mediante los siguientes pasos:

  1. Repita w para formar una string v de longitud n , tal que v[i] = w[i mod |w|] .
  2. Si bien el último carácter de v es el último en el orden ordenado de S , elimínelo.
  3. Reemplace el último carácter de v por su sucesor en el orden ordenado de S.

Por ejemplo, si n = 5, S = {a, b, c, d} y w = «sumar», entonces obtenemos v = «sumar». Dado que ‘d’ es el último carácter en el orden ordenado de S, lo eliminamos para obtener «adda» y luego reemplazamos la última ‘a’ por su sucesora ‘b’ para obtener la palabra Lyndon «addb».

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ implementation of
// the above approach
#include<bits/stdc++.h>
using namespace std;
 
int main()
{
    int n = 2;
    char S[] = {'0', '1', '2' };
    int k = 3;
    sort(S, S + 3);
     
    // To store the indices
    // of the characters
    vector<int> w;
    w.push_back(-1);
     
    // Loop till w is not empty    
    while(w.size() > 0)
    {
         
        // Incrementing the last character
        w[w.size()-1]++;
        int m = w.size();
        if(m == n)
        {
            string str;
            for(int i = 0; i < w.size(); i++)
            {
                str += S[w[i]];
            }
            cout << str << endl;
        }
     
        // Repeating w to get a
        // n-length string
        while(w.size() < n)
        {
            w.push_back(w[w.size() - m]);
        }
     
        // Removing the last character
        // as long it is equal to
        // the largest character in S
        while(w.size() > 0 && w[w.size() - 1] == k - 1)
        {
            w.pop_back();
        }
    }
    return 0;
}
 
// This code is contributed by AdeshSingh1

Java

// Java program to check if a string is two time
// rotation of another string.
import java.util.*;
public class Main
{
 
  // Driver method
  public static void main(String[] args)
  {
    int n=2;
    char S[]={'0', '1', '2' };
    int k = 3;
    Arrays.sort(S);
 
    // To store the indices
    // of the characters
    ArrayList<Integer> w = new ArrayList<Integer>();
    w.add(-1);
    // Loop till w is not empty    
    while(w.size() > 0)
    {
 
      // Incrementing the last character
      Integer value = w.get(w.size()-1); // get value
      value = value + 1; // increment value
      w.set(w.size()-1, value); // replace value
      int m = w.size();
      if(m == n)
      {
        String str="";
        for(int i = 0; i < w.size(); i++)
        {
          value = w.get(i);
          str += S[value];
        }
        System.out.println(str);
      }
 
      // Repeating w to get a
      // n-length string
      while(w.size() < n)
      {
        value = w.size() - m;
        value = w.get(value);
        w.add(value);
      }
 
      // Removing the last character
      // as long it is equal to
      // the largest character in S
      while(w.size() > 0 && w.get(w.size() - 1) == k - 1)
      {
        w.remove(w.size()-1);
      }
    }
  }
}
 
// This code is contributed by Aarti_Rathi

Python3

# Python implementation of
# the above approach
 
n = 2
S = ['0', '1', '2']
k = len(S)
S.sort()
 
# To store the indices
# of the characters
w = [-1]
 
# Loop till w is not empty
while w:
 
    # Incrementing the last character
    w[-1] += 1
    m = len(w)
    if m == n:
        print(''.join(S[i] for i in w))
   
    # Repeating w to get a
    # n-length string
    while len(w) < n:
        w.append(w[-m])
   
    # Removing the last character
    # as long it is equal to
    # the largest character in S
    while w and w[-1] == k - 1:
        w.pop()

C#

using System;
using System.Collections.Generic;
 
class GFG
{
   
  // Driver code
  public static void Main ()
  {
    int n=2;
    char [] S={'0', '1', '2' };
    int k = 3;
    Array.Sort(S);
 
    // To store the indices
    // of the characters
    List<int> w = new List<int>();
    w.Add(-1);
    // Loop till w is not empty    
    while(w.Count > 0)
    {
 
      // Incrementing the last character
      w[w.Count-1]++;
      int m = w.Count;
      if(m == n)
      {
        string str="";
        for(int i = 0; i < w.Count; i++)
        {
          str += S[w[i]];
        }
        Console.WriteLine(str);
      }
 
      // Repeating w to get a
      // n-length string
      while(w.Count < n)
      {
        w.Add(w[w.Count - m]);
      }
 
      // Removing the last character
      // as long it is equal to
      // the largest character in S
      while(w.Count > 0 && w[w.Count - 1] == k - 1)
      {
        w.RemoveAt(w.Count-1);
      }
    }
  }
}
 
// This code is contributed by Aarti_Rathi

Javascript

<script>
 
// JavaScript implementation of
// the above approach
 
// driver code
 
let n = 2;
let S = ['0', '1', '2'];
let k = 3;
S.sort();
 
// To store the indices
// of the characters
let w = [];
w.push(-1);
 
// Loop till w is not empty
while(w.length > 0)
{
 
    // Incrementing the last character
        w[w.length-1]++;
        let m = w.length;
        if(m == n)
        {
            let str = "";
            for(let i = 0; i < w.length; i++)
            {
                str += S[w[i]];
            }
            document.write(str,"</br>");
        }
     
        // Repeating w to get a
        // n-length string
        while(w.length < n)
        {
            w.push(w[w.length - m]);
        }
     
        // Removing the last character
        // as long it is equal to
        // the largest character in S
        while(w.length > 0 && w[w.length - 1] == k - 1)
        {
            w.pop();
        }
}
 
// This code is contributed by shinjanpatra
 
</script>
Producción:

01
02
12

Publicación traducida automáticamente

Artículo escrito por vaibhav29498 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *