Cho chuỗi chữ thường s và mảng shifts cùng độ dài. shifts[i] dịch chuyển i+1 ký tự đầu tiên của s đi shifts[i] vị trí (quay vòng 'z'→'a'). Tìm chuỗi kết quả.
Ví dụ: s="tomato", shifts=[2,5,2,3,7,4] → "qjcoes".
Giải thuật (Tính tích lũy dịch chuyển ngược)
- Chuyển ký tự thành mã ASCII (0-25)
- Tính tổng tích lũy dịch chuyển từ cuối về đầu:
shifts[i] += shifts[i+1] - Áp dụng dịch chuyển cho từng ký tự:
(char_code + shifts[i]) % 26 - Chuyển ngược về ký tự và nối chuỗi
Ví dụ triển khai
def solve(s, shifts):
start = ord("a")
res = [ord(ch) - start for ch in s]
for i in range(len(shifts) - 2, -1, -1):
shifts[i] += shifts[i + 1]
for i in range(len(s)):
c = (res[i] + shifts[i]) % 26
res[i] = chr(c + start)
return "".join(res)
print(solve("tomato", [2, 5, 2, 3, 7, 4]))
Đầu vào
"tomato", [2, 5, 2, 3, 7, 4]
Đầu ra
qjcoes