Cho một chuỗi s, chúng ta có thể xoay chuỗi tại một vị trí bất kỳ đúng một lần. Tìm độ dài chuỗi con đối xứng (palindrome) dài nhất có thể đạt được sau phép xoay đó.
Ví dụ: s = "elklev" → xoay giữa "el" và "klev" được "levelk", chuỗi con đối xứng dài nhất là "level" (độ dài 5). Kết quả: 5.
Giải thuật (Brute-force trên chuỗi gấp đôi)
Vì xoay chuỗi tương đương với lấy một chuỗi con của s + s có độ dài ≤ len(s).
- Tạo
s2 = s + s. - Khởi tạo
max_len = 0. - Duyệt mọi vị trí bắt đầu
xtừ 0 đếnlen(s)-1và độ dàiytừ 0 đếnlen(s):- Lấy chuỗi con
temp = s2[x : x + y]. - Nếu
templà palindrome vàlen(temp) > max_len, cập nhậtmax_len.
- Lấy chuỗi con
- Trả về
max_len.
Lưu ý: Giải pháp này có độ phức tạp O(n³), phù hợp cho chuỗi ngắn. Đối với chuỗi dài, cần dùng Manacher hoặc các thuật toán tối ưu hơn.
Mã nguồn Python
class Solution:
def solve(self, s):
s2 = 2 * s
max_len = 0
for x in range(len(s)):
for y in range(len(s) + 1):
temp = s2[x : x + y]
if temp == temp[::-1] and len(temp) > max_len:
max_len = len(temp)
return max_len
ob = Solution()
s = "elklev"
print(ob.solve(s)) # Output: 5
Đầu vào
"elklev"
Đầu ra
5