Dadas dos strings str1 y str2 y un entero d , la tarea es verificar si str2 se puede obtener rotando str1 por d lugares (hacia la izquierda o hacia la derecha).
Ejemplos:
Entrada: str1 = “abcdefg”, str2 = “cdefgab”, d = 2
Salida: Sí
Rotar str1 2 lugares a la izquierda.Entrada: str1 = “abcdefg”, str2 = “cdfdawb”, d = 6
Salida: No
Enfoque: Aquí se ha discutido un enfoque para resolver el mismo problema . En este artículo, el algoritmo de inversión se utiliza para rotar la string hacia la izquierda y hacia la derecha en O(n). Si alguna de las rotaciones de str1 es igual a str2 , imprima Sí ; de lo contrario, imprima No.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to reverse an array from left // index to right index (both inclusive) void ReverseArray(string& arr, int left, int right) { char temp; while (left < right) { temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } // Function that returns true if str1 can be // made equal to str2 by rotating either // d places to the left or to the right bool RotateAndCheck(string& str1, string& str2, int d) { if (str1.length() != str2.length()) return false; // Left Rotation string will contain // the string rotated Anti-Clockwise // Right Rotation string will contain // the string rotated Clockwise string left_rot_str1, right_rot_str1; bool left_flag = true, right_flag = true; int str1_size = str1.size(); // Copying the str1 string to left rotation string // and right rotation string for (int i = 0; i < str1_size; i++) { left_rot_str1.push_back(str1[i]); right_rot_str1.push_back(str1[i]); } // Rotating the string d positions to the left ReverseArray(left_rot_str1, 0, d - 1); ReverseArray(left_rot_str1, d, str1_size - 1); ReverseArray(left_rot_str1, 0, str1_size - 1); // Rotating the string d positions to the right ReverseArray(right_rot_str1, 0, str1_size - d - 1); ReverseArray(right_rot_str1, str1_size - d, str1_size - 1); ReverseArray(right_rot_str1, 0, str1_size - 1); // Comparing the rotated strings for (int i = 0; i < str1_size; i++) { // If cannot be made equal with left rotation if (left_rot_str1[i] != str2[i]) { left_flag = false; } // If cannot be made equal with right rotation if (right_rot_str1[i] != str2[i]) { right_flag = false; } } // If both or any one of the rotations // of str1 were equal to str2 if (left_flag || right_flag) return true; return false; } // Driver code int main() { string str1 = "abcdefg"; string str2 = "cdefgab"; // d is the rotating factor int d = 2; // In case length of str1 < d d = d % str1.size(); if (RotateAndCheck(str1, str2, d)) cout << "Yes"; else cout << "No"; return 0; }
Yes
Complejidad de tiempo: O(n), donde n representa el tamaño de la string dada.
Espacio auxiliar: O(n), donde n representa el tamaño de la string dada.
¡ Consulte el artículo completo sobre Comprobar si se puede obtener una string rotando otra string d lugares para obtener más detalles!
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA