Modifique la string insertando caracteres de modo que cada substring de longitud K consista solo en caracteres únicos

Dada la string S de tamaño N que consta de K caracteres distintos y (N – K) ‘?’ s, la tarea es reemplazar todos los ‘?’ con caracteres existentes de la string, de modo que cada substring de tamaño K haya consistido únicamente en caracteres únicos. Si no es posible hacerlo, imprima “-1” .

Ejemplos:

Entrada: S = “????abcd”, K = 4
Salida: abcdabcd
Explicación:
Reemplazar los 4 ‘?’s con “abcd” modifica la string S a “abcdabcd”, lo que satisface la condición dada.

Entrada: S = “?a?b?c”, K = 3
Salida: bacbac
Explicación:
Reemplazar S[0] con ‘b’, S[2] con ‘c’ y S[4] con ‘a’ modifica la string S a “bacbac”, que satisface la condición dada.

 

Enfoque: La idea se basa en la observación de que en la string resultante final, cada carácter debe aparecer después de exactamente K lugares, como el (K + 1) el carácter debe ser el mismo que el 1 er , (K + 2) el carácter debe ser el mismo que el 2º , y así sucesivamente.

Siga los pasos a continuación para resolver el problema:

  • Inicialice un hashmap M para almacenar las posiciones de los caracteres.
  • Atraviese la string S usando la variable i y si el carácter actual S[i] no es el mismo que ‘ ? ‘, luego actualice M[i % K] = S[i] .
  • Recorra la string S usando la variable i y si el valor de   i%k no está presente en el mapa M , imprima «-1» y salga del ciclo . De lo contrario, actualice S[i] a M[i % K] .
  • Después de los pasos anteriores, si el ciclo no se rompe, imprima S como la string resultante.

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

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to replace all '?'
// characters in a string such
// that the given conditions are satisfied
void fillString(string s, int k)
{
    unordered_map<int, char> mp;
 
    // Traverse the string to Map the
    // characters with respective positions
    for (int i = 0; i < s.size(); i++) {
        if (s[i] != '?') {
            mp[i % k] = s[i];
        }
    }
 
    // Traverse the string again and
    // replace all unknown characters
    for (int i = 0; i < s.size(); i++) {
 
        // If i % k is not found in
        // the Map M, then return -1
        if (mp.find(i % k) == mp.end()) {
 
            cout << -1;
            return;
        }
 
        // Update S[i]
        s[i] = mp[i % k];
    }
 
    // Print the string S
    cout << s;
}
 
// Driver Code
int main()
{
    string S = "????abcd";
    int K = 4;
    fillString(S, K);
 
    return 0;
}

Java

// Java Program to implement
// the above approach
import java.io.*;
import java.util.*;
 
class GFG {
 
    // Function to replace all '?'
    // characters in a string such
    // that the given conditions are satisfied
    static void fillString(String str, int k)
    {
 
        char s[] = str.toCharArray();
 
        HashMap<Integer, Character> mp = new HashMap<>();
 
        // Traverse the string to Map the
        // characters with respective positions
        for (int i = 0; i < s.length; i++) {
            if (s[i] != '?') {
                mp.put(i % k, s[i]);
            }
        }
 
        // Traverse the string again and
        // replace all unknown characters
        for (int i = 0; i < s.length; i++) {
 
            // If i % k is not found in
            // the Map M, then return -1
            if (!mp.containsKey(i % k)) {
                System.out.println(-1);
                return;
            }
 
            // Update S[i]
            s[i] = mp.getOrDefault(i % k, s[i]);
        }
 
        // Print the string S
        System.out.println(new String(s));
    }
 
    // Driver Code
    public static void main(String[] args)
    {
 
        String S = "????abcd";
        int K = 4;
        fillString(S, K);
    }
}
 
// This code is contributed by Kingash.

Python3

# Python 3 program for the above approach
 
# Function to replace all '?'
# characters in a string such
# that the given conditions are satisfied
def fillString(s, k):
    mp = {}
 
    # Traverse the string to Map the
    # characters with respective positions
    for i in range(len(s)):
        if (s[i] != '?'):
            mp[i % k] = s[i]
 
    # Traverse the string again and
    # replace all unknown characters
    s = list(s)
    for i in range(len(s)):
       
        # If i % k is not found in
        # the Map M, then return -1
        if ((i % k) not in mp):
            print(-1)
            return
 
        # Update S[i]
        s[i] = mp[i % k]
 
    # Print the string S
    s =   ''.join(s)
    print(s)
 
# Driver Code
if __name__ == '__main__':
    S = "????abcd"
    K = 4
    fillString(S, K)
 
    # This code is contributed by bgangwar59.

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG
{
 
  // Function to replace all '?'
  // characters in a string such
  // that the given conditions are satisfied
  static void fillString(string str, int k)
  {
 
    char[] s = str.ToCharArray();
 
    Dictionary<int,
    int> mp = new Dictionary<int,
    int>();
 
    // Traverse the string to Map the
    // characters with respective positions
    for (int i = 0; i < s.Length; i++) {
      if (s[i] != '?') {
        mp[i % k] = s[i];
      }
    }
 
    // Traverse the string again and
    // replace all unknown characters
    for (int i = 0; i < s.Length; i++) {
 
      // If i % k is not found in
      // the Map M, then return -1
      if (!mp.ContainsKey(i % k)) {
        Console.WriteLine(-1);
        return;
      }
 
      // Update S[i]
      s[i] = (char)mp[i % k];
 
    }
 
    // Print the string S
    Console.WriteLine(new string(s));
  }
 
  // Driver code
  static void Main()
  {
    string S = "????abcd";
    int K = 4;
    fillString(S, K);
  }
}
 
// This code is contributed by susmitakundugoaldanga.

Javascript

<script>
      // JavaScript program for the above approach
      // Function to replace all '?'
      // characters in a string such
      // that the given conditions are satisfied
      function fillString(str, k) {
        var s = str.split("");
 
        var mp = {};
 
        // Traverse the string to Map the
        // characters with respective positions
        for (var i = 0; i < s.length; i++) {
          if (s[i] !== "?") {
            mp[i % k] = s[i];
          }
        }
 
        // Traverse the string again and
        // replace all unknown characters
        for (var i = 0; i < s.length; i++) {
          // If i % k is not found in
          // the Map M, then return -1
          if (!mp.hasOwnProperty(i % k)) {
            document.write(-1);
            return;
          }
 
          // Update S[i]
          s[i] = mp[i % k];
        }
 
        // Print the string S
        document.write(s.join("") + "<br>");
      }
 
      // Driver code
      var S = "????abcd";
      var K = 4;
      fillString(S, K);
    </script>
Producción: 

abcdabcd

 

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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