Cho hai chuỗi a và b. Kiểm tra xem b có thể được tạo ra bằng cách xoay a đúng 2 vị trí theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ.
Ví dụ
Input: a = "google", b = "legoog" → True (xoay trái 2: "go" → cuối → "oglego"? Wait: "google" xoay trái 2: bỏ 2 ký tự đầu "go" đưa ra cuối → "oglego"? Không, ví dụ gốc nói "legoog". Kiểm tra: "google" → xoay trái 2: "oglego". Xoay phải 2: "legoog". Đúng, "legoog" là xoay phải 2).
Input: a = "tuorialst", b = "tutorials" → False.
Ý tưởng
- Nếu độ dài khác nhau → False.
- Nếu độ dài ≤ 2 → True (xoay 2 vị trí trên chuỗi ≤2 ký tự trả về chuỗi gốc).
- Xoay trái 2:
b.substring(2) + b.substring(0, 2). - Xoay phải 2:
b.substring(len-2) + b.substring(0, len-2). - Kiểm tra xem
acó bằng một trong hai kết quả trên không.
Triển khai Java (đã sửa lỗi logic code gốc)
public class RotateStringCheck {
public static boolean isRotatedByTwo(String a, String b) {
if (a.length() != b.length()) return false;
int len = a.length();
if (len <= 2) return true; // xoay 2 trên chuỗi ≤2 giữ nguyên
// Xoay trái 2: bỏ 2 ký tự đầu đưa ra cuối
String leftRot = b.substring(2) + b.substring(0, 2);
// Xoay phải 2: lấy 2 ký tự cuối đưa ra đầu
String rightRot = b.substring(len - 2) + b.substring(0, len - 2);
return a.equals(leftRot) || a.equals(rightRot);
}
public static void main(String[] args) {
System.out.println(isRotatedByTwo("google", "legoog")); // true (xoay phải 2)
System.out.println(isRotatedByTwo("google", "oglego")); // true (xoay trái 2)
System.out.println(isRotatedByTwo("tuorialst", "tutorials")); // false
}
}
Lưu ý sửa lỗi code gốc
Code gốc có lỗi: s2 = str2.substring(0,2) + str2.substring(0,2) (lặp 2 lần prefix) thay vì str2.substring(len-2) + str2.substring(0, len-2). Bản sửa trên đã khắc phục.
Phân tích
- Thời gian: O(n) do substring và equals.
- Không gian: O(n) tạo chuỗi mới.
- Có thể tối ưu O(1) space bằng cách so sánh ký tự trực tiếp mà không tạo chuỗi con.