Encuentre la string entre las strings dadas representadas usando el patrón de cifrado dado

Dada una array de strings arr[] de tamaño N y una string cifrada str , la tarea es encontrar la string correcta de la array de strings dada cuyo cifrado dará str donde str se cifra utilizando las siguientes reglas: 

  • Los caracteres iniciales forman un número entero que representa el número de símbolos en mayúsculas en la string descifrada.
  • Los siguientes 3 caracteres son los últimos 3 caracteres de la string descifrada en orden inverso.
  • Los últimos caracteres también forman un número entero que representa la suma de todos los dígitos de la contraseña.

La longitud de cada string en la array es de al menos 3 y si hay más de una respuesta correcta, imprima entre ellas.

Ejemplos: 

Entrada: arr[] = {“P@sswORD1”, “PASS123word”}, str = “4dro6”
Salida: PASS123word
Explicación: La string descifrada que representa str = “4dro6” debe tener 
4 letras mayúsculas, la suma de todos los dígitos en ella como 6 y termina en “ord”. 
La string de salida cumple todas las propiedades siguientes.

Entrada: arr[] = {“Geeks”, “code”, “Day&Night”}, str = “1thg10”
Salida: -1
Explicación: No existe tal string que satisfaga el cifrado.

 

Enfoque: el problema dado es un problema basado en la implementación que se puede resolver siguiendo los pasos a continuación:

  • Almacene el número entero representado por los dígitos iniciales en un principio de número entero.
  • De manera similar, almacene el número entero representado por los últimos dígitos en un final de número entero.
  • Almacene e invierta la string en el medio de los dos enteros dados en una string en el medio.
  • Itere sobre todas las strings en la array dada arr[] y si alguna de ellas satisface las tres condiciones dadas, devuelva la string respectiva; de lo contrario, devuelva -1 .

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

C++

// C++ Program of the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the correct decrypted
// string out of the given array arr
string decryptStr(vector<string> arr,
                  string str)
{
    // Stores the size of string
    int N = str.size();
    int i = 0, j = N - 1;
 
    // Last index of the starting digit
    while (isdigit(str[i]))
        i++;
 
    // First index of the last string
    while (isdigit(str[j]))
        j--;
 
    // Stores the starting integer
    int start = stoi(str.substr(0, i));
 
    // Stores the ending integer
    int end = stoi(str.substr(j + 1, N - j));
 
    // Stores the middle string
    string mid = str.substr(i, 3);
 
    // Reverse the middle string
    reverse(mid.begin(), mid.end());
 
    // Loop to iterate over all
    // string in the given array
    for (auto S : arr) {
        int upper = 0, sum = 0;
        for (int i = 0; i < S.length(); i++) {
 
            // Calculate the count
            // of upper case char
            if (isupper(S[i]))
                upper++;
 
            // Calculate the sum
            // of digits in S
            if (isdigit(S[i]))
                sum += (S[i] - '0');
        }
        // If all the required conditions
        // are satisfied
        if (upper == start && sum == end
            && S.substr(S.length() - 3, 3)
            == mid)
            return S;
    }
 
    return "-1";
}
 
// Driver Code
int main()
{
    vector<string> arr = { "P@sswORD1",
                          "PASS123word" };
    string str = "4dro6";
 
    cout << decryptStr(arr, str);
    return 0;
}

Java

// Java Program of the above approach
import java.util.*;
class GFG{
 
// Function to find the correct decrypted
// String out of the given array arr
static String decryptStr(String []arr,
                  String str)
{
   
    // Stores the size of String
    int N = str.length();
    int i = 0, j = N - 1;
 
    // Last index of the starting digit
    while (Character.isDigit(str.charAt(i)))
        i++;
 
    // First index of the last String
    while (Character.isDigit(str.charAt(j)))
        j--;
 
    // Stores the starting integer
    int start = Integer.valueOf(str.substring(0, i));
 
    // Stores the ending integer
    int end = Integer.valueOf(str.substring(j + 1));
 
    // Stores the middle String
    String mid = str.substring(i, i+3);
 
    // Reverse the middle String
    mid = reverse(mid);
 
    // Loop to iterate over all
    // String in the given array
    for (String S : arr) {
        int upper = 0, sum = 0;
        for (int i2 = 0; i2 < S.length(); i2++) {
 
            // Calculate the count
            // of upper case char
            if (Character.isUpperCase(S.charAt(i2)))
                upper++;
 
            // Calculate the sum
            // of digits in S
            if (Character.isDigit(S.charAt(i2)))
                sum += (S.charAt(i2) - '0');
        }
        // If all the required conditions
        // are satisfied
        if (upper == start && sum == end
            && S.substring(S.length() - 3).equals(mid))
            return S;
    }
 
    return "-1";
}
static String reverse(String input) {
    char[] a = input.toCharArray();
    int l, r = a.length - 1;
    for (l = 0; l < r; l++, r--) {
        char temp = a[l];
        a[l] = a[r];
        a[r] = temp;
    }
    return String.valueOf(a);
}
   
// Driver Code
public static void main(String[] args)
{
    String []arr = { "P@sswORD1",
                          "PASS123word" };
    String str = "4dro6";
 
    System.out.print(decryptStr(arr, str));
}
}
 
// This code is contributed by shikhasingrajput

Python3

# Python 3 Program of the above approach
 
# Function to find the correct decrypted
# string out of the given array arr
def decryptStr(arr,
               st):
 
    # Stores the size of string
    N = len(st)
    i = 0
    j = N - 1
 
    # Last index of the starting digit
    while ((st[i].isdigit())):
        i += 1
 
    # First index of the last string
    while ((st[j].isdigit())):
        j -= 1
 
    # Stores the starting integer
    start = int(st[0:i])
 
    # Stores the ending integer
    end = int(st[j + 1:])
 
    # Stores the middle string
    mid = st[i:3+i]
 
    # Reverse the middle string
    mid_list = list(mid)
    mid_list.reverse()
    mid = ''.join(mid_list)
 
    # Loop to iterate over all
    # string in the given array
    for S in arr:
        upper = 0
        sum = 0
        for i in range(len(S)):
 
            # Calculate the count
            # of upper case char
            if ((S[i].isupper())):
                upper += 1
 
            # Calculate the sum
            # of digits in S
            if ((S[i].isdigit())):
                sum += (ord(S[i]) - ord('0'))
 
        # If all the required conditions
        # are satisfied
        if (upper == start and sum == end
            and S[len(S) - 3:]
                == mid):
            return S
 
    return "-1"
 
# Driver Code
if __name__ == "__main__":
 
    arr = ["P@sswORD1",
           "PASS123word"]
    st = "4dro6"
 
    print(decryptStr(arr, st))
 
    # This code is contributed by ukasp.

C#

// C# program to implement above approach
using System;
using System.Collections;
using System.Collections.Generic;
 
class GFG
{
 
  // Function to find the correct decrypted
  // String out of the given array arr
  static String decryptStr(String []arr, String str)
  {
 
    // Stores the size of String
    int N = str.Length;
    int i = 0, j = N - 1;
 
    // Last index of the starting digit
    while (Char.IsDigit(str[i]))
      i++;
 
    // First index of the last String
    while (Char.IsDigit(str[j]))
      j--;
 
 
    // Stores the starting integer
    int start = Convert.ToInt32(str.Substring(0, i));
 
    // Stores the ending integer
    int end = Convert.ToInt32(str.Substring(j+1));
 
    // Stores the middle String
    String mid = str.Substring(i, 3);
 
    // Reverse the middle String
    mid = reverse(mid);
 
    // Loop to iterate over all
    // String in the given array
    foreach (String S in arr) {
      int upper = 0, sum = 0;
      for (int i2 = 0 ; i2 < S.Length ; i2++) {
 
        // Calculate the count
        // of upper case char
        if (Char.IsUpper(S[i2]))
          upper++;
 
        // Calculate the sum
        // of digits in S
        if (Char.IsDigit(S[i2]))
          sum += ((int)S[i2] - (int)'0');
      }
      // If all the required conditions
      // are satisfied
      if (upper == start && sum == end && S.Substring(S.Length - 3).Equals(mid))
        return S;
    }
 
    return "-1";
  }
 
  static String reverse(String input) {
    char[] a = input.ToCharArray();
    int l, r = a.Length - 1;
    for (l = 0 ; l < r ; l++, r--) {
      char temp = a[l];
      a[l] = a[r];
      a[r] = temp;
    }
    return string.Join("", a);
  }
 
  // Driver code
  public static void Main(string[] args){
 
    String []arr = new String[]{"P@sswORD1", "PASS123word"};
    String str = "4dro6";
 
    Console.WriteLine(decryptStr(arr, str));
 
  }
}
 
// This code is contributed by subhamgoyal2014.

Javascript

<script>
    // JavaScript Program of the above approach
 
    // Function to find the correct decrypted
    // string out of the given array arr
    const decryptStr = (arr, str) => {
     
        // Stores the size of string
        let N = str.length;
        let i = 0, j = N - 1;
 
        // Last index of the starting digit
        while (str[i] >= '0' && str[i] <= '9')
            i++;
 
        // First index of the last string
        while (str[j] >= '0' && str[j] <= '9')
            j--;
        // Stores the starting integer
        let start = parseInt(str.substring(0, i));
 
        // Stores the ending integer
        let end = parseInt(str.substring(j + 1, j + 1 + N - j));
 
        // Stores the middle string
        let mid = str.substring(i, i + 3);
        // Reverse the middle string
        mid = [...mid].reverse().join('')
 
        // Loop to iterate over all
        // string in the given array
        for (let S in arr) {
            let upper = 0, sum = 0;
            for (let i = 0; i < arr[S].length; i++) {
 
                // Calculate the count
                // of upper case char
                if (arr[S][i] >= 'A' && arr[S][i] <= 'Z')
                    upper++;
 
                // Calculate the sum
                // of digits in S
                if (arr[S][i] >= '0' && arr[S][i] <= '9')
                    sum += (arr[S].charCodeAt(i) - '0'.charCodeAt(0));
            }
            // If all the required conditions
            // are satisfied
            if (upper == start && sum == end
                && arr[S].substring(arr[S].length - 3, arr[S].length + 3)
                == mid)
                return arr[S];
        }
 
        return "-1";
    }
 
    // Driver Code
    let arr = ["P@sswORD1", "PASS123word"];
    let str = "4dro6";
 
    document.write(decryptStr(arr, str));
 
// This code is contributed by rakeshsahni
 
</script>
Producción

PASS123word

Complejidad de Tiempo: O(N * M) donde M es la longitud máxima de una string del arreglo
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

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