String lexicográficamente más pequeña después de operaciones M

Dada una string S y un entero M . La tarea es realizar exactamente M operaciones para obtener la string lexicográfica más pequeña.

  • En cada operación, seleccione un carácter de manera óptima de la string y actualícelo con el siguiente carácter inmediato ( aaa -> aab ), de modo que la string permanezca lexicográficamente más pequeña.
  • Se permiten múltiples operaciones sobre un solo carácter de la string.

Nota: Considere el siguiente de ‘z’ como ‘a’.
Ejemplos:

Entrada: S = “aazzx”, M = 6 
Salida: aaaab 
Explicación: 
Intentamos formar la string lexicográfica más pequeña para cada operación. 
Para m = 1: actualice “aazzx” a “aaazx” 
para m = 2: actualice “aaazx” a “aaaax” 
para m = 3: actualice “aaaax” a “aaaay” 
para m = 4: actualice “aaaay” a “ aaaaz” 
para m = 5: actualice “aaaaz” a “aaaaa” 
para m = 6: actualice “aaaaa” a “aaaab”, que es lexicográficamente más pequeño que “aaaba”, “aabaa”, “abaaa”, “baaaa”. 
String final después de 6 operaciones: “aaaab”.
Entrada: S = “z”, M = 27 
Salida:
Explicación: 
Intente formar la string lexicográfica más pequeña para cada operación, ya que solo hay un carácter, por lo que las 27 operaciones deben realizarse sobre él. La string final después de la operación 27 es «a».

Enfoque: la idea es implementar un enfoque codicioso simple , para iterar la string desde el comienzo de la string y, mientras se itera, centrarse en el elemento actual de la string para hacerlo lo más pequeño posible.

  • Supongamos que el elemento actual es r , para hacer que r sea el más pequeño, es decir , a , se requieren 9 operaciones, llamemos al valor como distancia .
  • Ahora, verifique si M es mayor que igual a la distancia , luego actualice el carácter actual a ‘a’ y disminuya el valor de M por distancia . De lo contrario, continúe con la siguiente iteración.
  • Como el siguiente de z es a , se forma un ciclo de 26. Entonces, el último carácter de la string se puede actualizar con el último carácter + (M % 26) .

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

C++

// C++ implementation to find the
// lexicographical smallest string
// after performing M operations
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the
// lexicographical smallest string
// after performing M operations
void smallest_string(string s, int m)
{
 
    // Size of the given string
    int n = s.size();
 
    // Declare an array a
    int a[n];
 
    // For each i, a[i] contain number
    // of operations to update s[i] to 'a'
    for (int i = 0; i < n; i++) {
        int distance = s[i] - 'a';
        if (distance == 0)
            a[i] = 0;
 
        else
            a[i] = 26 - distance;
    }
 
    for (int i = 0; i < n; i++) {
        // Check if m >= ar[i],
        // then update s[i] to 'a'
        // decrement k by a[i]
        if (m >= a[i]) {
            s[i] = 'a';
            m = m - a[i];
        }
    }
 
    // Form a cycle of 26
    m = m % 26;
 
    // update last element of
    // string with the value
    // s[i] + (k % 26)
    s[n - 1] = s[n - 1] + m;
 
    // Return the answer
    cout << s;
}
 
// Driver code
int main()
{
    string str = "aazzx";
    int m = 6;
    smallest_string(str, m);
    return 0;
}

Java

// Java implementation to find the
// lexicographical smallest String
// after performing M operations
class GFG{
 
// Function to find the
// lexicographical smallest String
// after performing M operations
static void smallest_String(char []s, int m)
{
 
    // Size of the given String
    int n = s.length;
 
    // Declare an array a
    int []a = new int[n];
 
    // For each i, a[i] contain number
    // of operations to update s[i] to 'a'
    for (int i = 0; i < n; i++)
    {
        int distance = s[i] - 'a';
        if (distance == 0)
            a[i] = 0;
 
        else
            a[i] = 26 - distance;
    }
 
    for (int i = 0; i < n; i++)
    {
        // Check if m >= ar[i],
        // then update s[i] to 'a'
        // decrement k by a[i]
        if (m >= a[i])
        {
            s[i] = 'a';
            m = m - a[i];
        }
    }
 
    // Form a cycle of 26
    m = m % 26;
 
    // update last element of
    // String with the value
    // s[i] + (k % 26)
    s[n - 1] = (char) (s[n - 1] + m);
 
    // Return the answer
    System.out.print(String.valueOf(s));
}
 
// Driver code
public static void main(String[] args)
{
    String str = "aazzx";
    int m = 6;
    smallest_String(str.toCharArray(), m);
}
}
 
// This code is contributed by Princi Singh

Python3

# Python3 implementation to find the
# lexicographical smallest string
# after performing M operations
 
# Function to find the
# lexicographical smallest string
# after performing M operations
def smallest_string(s, m):
     
    # Size of the given string
    n = len(s);
     
    l = list(s)
 
    # Declare an array a
    a = [0] * n;
 
    # For each i, a[i] contain number
    # of operations to update s[i] to 'a'
    for i in range(n):
        distance = ord(s[i]) - ord('a');
         
        if (distance == 0):
            a[i] = 0;
        else:
            a[i] = 26 - distance;
     
    for i in range(n):
         
        # Check if m >= ar[i],
        # then update s[i] to 'a'
        # decrement k by a[i]
        if (m >= a[i]):
            l[i] = 'a';
            m = m - a[i];
         
    # Form a cycle of 26
    m = m % 26;
 
    # update last element of
    # with the value
    # s[i] + (k % 26)
     
    # Return the answer
    for i in range(len(l) - 1):
        print(l[i], end = "")
     
    print(chr(ord(l[n - 1]) + m))
 
# Driver code
str = "aazzx";
m = 6;
 
smallest_string(str, m);
 
# This code is contributed by grand_master

C#

// C# implementation to find the
// lexicographical smallest String
// after performing M operations
using System;
 
class GFG{
 
// Function to find the
// lexicographical smallest String
// after performing M operations
static void smallest_String(char []s, int m)
{
     
    // Size of the given String
    int n = s.Length;
 
    // Declare an array a
    int []a = new int[n];
 
    // For each i, a[i] contain number
    // of operations to update s[i] to 'a'
    for(int i = 0; i < n; i++)
    {
        int distance = s[i] - 'a';
        if (distance == 0)
            a[i] = 0;
        else
            a[i] = 26 - distance;
    }
 
    for(int i = 0; i < n; i++)
    {
         
        // Check if m >= ar[i],
        // then update s[i] to 'a'
        // decrement k by a[i]
        if (m >= a[i])
        {
            s[i] = 'a';
            m = m - a[i];
        }
    }
 
    // Form a cycle of 26
    m = m % 26;
 
    // Update last element of
    // String with the value
    // s[i] + (k % 26)
    s[n - 1] = (char)(s[n - 1] + m);
 
    // Return the answer
    Console.Write(String.Join("", s));
}
 
// Driver code
public static void Main(String[] args)
{
    String str = "aazzx";
    int m = 6;
     
    smallest_String(str.ToCharArray(), m);
}
}
 
// This code is contributed by Princi Singh

Javascript

<script>
 
// JavaScript implementation to find the
// lexicographical smallest string
// after performing M operations
 
 
// Function to find the
// lexicographical smallest string
// after performing M operations
function smallest_string(s,m)
{
 
    // Size of the given string
    let n = s.length;
 
    // Declare an array a
    let a = new Array(n).fill(0);
 
    // For each i, a[i] contain number
    // of operations to update s[i] to 'a'
    for (let i = 0; i < n; i++) {
        let distance = s.charCodeAt(i) - 'a'.charCodeAt(0);
        if (distance == 0)
            a[i] = 0;
 
        else
            a[i] = 26 - distance;
    }
 
    for (let i = 0; i <br n; i++) {
        // Check if m >= ar[i],
        // then update s[i] to 'a'
        // decrement k by a[i]
        if (m >= a[i]) {
            s = s.replace(s[i],'a');
            m = m - a[i];
        }
    }
 
    // Form a cycle of 26
    m = m % 26;
 
    // update last element of
    // string with the value
    // s[i] + (k % 26)
 
    s = s.substring(0,n-1)  + String.fromCharCode(s.charCodeAt(n - 1) + m);
 
    // Return the answer
    document.write(s,"</br>");
}
 
// Driver code
 
let str = "aazzx";
let m = 6;
smallest_string(str, m)
 
// This code is contributed by shinjanpatra
 
</script>
Producción:

aaaab

Complejidad de tiempo: O(N), donde N es la longitud de la string dada 
Espacio auxiliar: O(N), donde N es la longitud de la string dada
 

Publicación traducida automáticamente

Artículo escrito por Chauhanvishesh99 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 *