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:
- Si _ está en la posición i , entonces _ puede intercambiarse con un carácter en la posición i+1 o i-1 .
- 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 .
- 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