Número mínimo de operaciones dadas requeridas para hacer que dos strings sean iguales

Dadas dos strings A y B , ambas strings contienen caracteres a y b y tienen la misma longitud. Hay un _ (espacio vacío) en ambas strings. La tarea es convertir la primera string en la segunda string haciendo el número mínimo de las siguientes operaciones:

  1. Si _ está en la posición i , entonces _ puede intercambiarse con un carácter en la posición i+1 o i-1 .
  2. Si los caracteres en las posiciones i+1 e i+2 son diferentes, _ se puede intercambiar con un carácter en la posición i+1 o i+2 .
  3. De manera similar, si los caracteres en las posiciones i-1 e i-2 son diferentes, _ se puede intercambiar con un carácter en la posición i-1 o i-2 .

Ejemplos:

Entrada: A = “aba_a”, B = “_baaa”
Salida: 2
Movimiento 1: A = “ab_aa” (Intercambiado A[2] con A[3])
Movimiento 2: A = “_baaa” (Intercambiado A[0] con A[2])

Entrada: A = “a_b”, B = “ab_”
Salida: 1

Fuente: Conjunto de entrevistas Directi 7

Acercarse:

  • Aplique una búsqueda primero en amplitud simple sobre la string y un elemento de la cola utilizada para BFS contendrá el par str, pos donde pos es la posición de _ en la string str .
  • También mantenga un mapa vis que almacenará la string como clave y los movimientos mínimos para llegar a la string como valor.
  • Para cada string str de la cola, genere una nueva string tmp basada en las cuatro condiciones dadas y actualice el mapa vis como vis [tmp] = vis[str] + 1 .
  • Repita los pasos anteriores hasta que la cola esté vacía o se genere la string requerida, es decir, tmp == B
  • Si se genera la string requerida, devuelva vis[str] + 1 , que es el número mínimo de operaciones requeridas para cambiar A a B.

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;
  
// Function to return the minimum number of
// operations to convert string A to B
int minOperations(string s, string f)
{
  
    // If both the strings are equal then
    // no operation needs to be performed
    if (s == f)
        return 0;
  
    unordered_map<string, int> vis;
  
    int n;
  
    n = s.length();
    int pos = 0;
    for (int i = 0; i < s.length(); i++) {
        if (s[i] == '_') {
  
            // store the position of '_'
            pos = i;
            break;
        }
    }
  
    // to store the generated string at every
    // move and the position of '_' within it
    queue<pair<string, int> > q;
  
    q.push({ s, pos });
  
    // vis will store the minimum operations
    // to reach that particular string
    vis[s] = 0;
  
    while (!q.empty()) {
        string ss = q.front().first;
        int pp = q.front().second;
  
        // minimum moves to reach the string ss
        int dist = vis[ss];
        q.pop();
  
        // try all 4 possible operations
  
        // if '_' can be swapped with
        // the character on it's left
        if (pp > 0) {
  
            // swap with the left character
            swap(ss[pp], ss[pp - 1]);
  
            // if the string is generated
            // for the first time
            if (!vis.count(ss)) {
  
                // if generated string is
                // the required string
                if (ss == f) {
                    return dist + 1;
                    break;
                }
  
                // update the distance for the
                // currently generated string
                vis[ss] = dist + 1;
                q.push({ ss, pp - 1 });
            }
  
            // restore the string before it was
            // swapped to check other cases
            swap(ss[pp], ss[pp - 1]);
        }
  
        // swap '_' with the character
        // on it's right this time
        if (pp < n - 1) {
            swap(ss[pp], ss[pp + 1]);
            if (!vis.count(ss)) {
                if (ss == f) {
                    return dist + 1;
                    break;
                }
                vis[ss] = dist + 1;
                q.push({ ss, pp + 1 });
            }
            swap(ss[pp], ss[pp + 1]);
        }
  
        // if '_' can be swapped
        // with the character 'i+2'
        if (pp > 1 && ss[pp - 1] != ss[pp - 2]) {
            swap(ss[pp], ss[pp - 2]);
            if (!vis.count(ss)) {
                if (ss == f) {
                    return dist + 1;
                    break;
                }
                vis[ss] = dist + 1;
                q.push({ ss, pp - 2 });
            }
            swap(ss[pp], ss[pp - 2]);
        }
  
        // if '_' can be swapped
        // with the character at 'i+2'
        if (pp < n - 2 && ss[pp + 1] != ss[pp + 2]) {
            swap(ss[pp], ss[pp + 2]);
            if (!vis.count(ss)) {
                if (ss == f) {
                    return dist + 1;
                    break;
                }
                vis[ss] = dist + 1;
                q.push({ ss, pp + 2 });
            }
            swap(ss[pp], ss[pp + 2]);
        }
    }
}
  
// Driver code
int main()
{
  
    string A = "aba_a";
    string B = "_baaa";
  
    cout << minOperations(A, B);
  
    return 0;
}

Python3

# Python3 implementation of the approach
from collections import deque
  
# Function to return the minimum number of
# operations to convert string A to B
def minOperations(s: str, f: str) -> int:
  
    # If both the strings are equal then
    # no operation needs to be performed
    if s == f:
        return 0
  
    vis = dict()
    n = len(s)
    pos = 0
    for i in range(n):
        if s[i] == '_':
  
            # store the position of '_'
            pos = i
            break
  
    # to store the generated string at every
    # move and the position of '_' within it
    q = deque()
    q.append((s, pos))
  
    # vis will store the minimum operations
    # to reach that particular string
    vis[s] = 0
  
    while q:
        ss = q[0][0]
        pp = q[0][1]
  
        # minimum moves to reach the string ss
        dist = vis[ss]
        q.popleft()
  
        ss = list(ss)
  
        # try all 4 possible operations
  
        # if '_' can be swapped with
        # the character on it's left
        if pp > 0:
  
            # swap with the left character
            ss[pp], ss[pp - 1] = ss[pp - 1], ss[pp]
            ss = ''.join(ss)
  
            # if the string is generated
            # for the first time
            if ss not in vis:
  
                # if generated string is
                # the required string
                if ss == f:
                    return dist + 1
  
                # update the distance for the
                # currently generated string
                vis[ss] = dist + 1
                q.append((ss, pp - 1))
  
            ss = list(ss)
  
            # restore the string before it was
            # swapped to check other cases
            ss[pp], ss[pp - 1] = ss[pp - 1], ss[pp]
            ss = ''.join(ss)
  
        # swap '_' with the character
        # on it's right this time
        if pp < n - 1:
            ss = list(ss)
            ss[pp], ss[pp + 1] = ss[pp + 1], ss[pp]
            ss = ''.join(ss)
  
            if ss not in vis:
                if ss == f:
                    return dist + 1
  
                vis[ss] = dist + 1
                q.append((ss, pp + 1))
  
            ss = list(ss)
            ss[pp], ss[pp + 1] = ss[pp + 1], ss[pp]
            ss = ''.join(ss)
  
        # if '_' can be swapped
        # with the character 'i+2'
        if pp > 1 and ss[pp - 1] != ss[pp - 2]:
            ss = list(ss)
            ss[pp], ss[pp - 2] = ss[pp - 2], ss[pp]
            ss = ''.join(ss)
  
            if ss not in vis:
                if ss == f:
                    return dist + 1
  
                vis[ss] = dist + 1
                q.append((ss, pp - 2))
  
            ss = list(ss)
            ss[pp], ss[pp - 2] = ss[pp - 2], ss[pp]
            ss = ''.join(ss)
  
        # if '_' can be swapped
        # with the character at 'i+2'
        if pp < n - 2 and ss[pp + 1] != ss[pp + 2]:
            ss = list(ss)
            ss[pp], ss[pp + 2] = ss[pp + 2], ss[pp]
            ss = ''.join(ss)
  
            if ss not in vis:
                if ss == f:
                    return dist + 1
  
                vis[ss] = dist + 1
                q.append((ss, pp + 2))
  
            ss = list(ss)
            ss[pp], ss[pp + 2] = ss[pp + 2], ss[pp]
            ss = ''.join(ss)
  
# Driver Code
if __name__ == "__main__":
  
    A = "aba_a"
    B = "_baaa"
  
    print(minOperations(A, B))
  
# This code is contributed by
# sanjeev2552
Producción:

2

Publicación traducida automáticamente

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