Giả sử chúng ta có một chuỗi S. Độ dài là n. N hộp này liền kề nhau, một ký tự R ở vị trí thứ i đại diện cho hộp thứ i đang được đẩy về phía bên phải. tương tự, L ở vị trí thứ i biểu thị rằng hộp thứ i đang được đẩy về phía trái, một dấu chấm '.' cho biết một không gian trống. Bắt đầu từ cấu hình ban đầu, tại mỗi đơn vị thời gian, một hộp được đẩy sang bên phải có thể đẩy hộp tiếp theo sang phải, hành động tương tự cũng có thể được áp dụng cho bên trái. Chúng ta phải tìm vị trí cuối cùng của tất cả các hộp khi không có thêm chuyển động nào khả thi.
Vì vậy, nếu đầu vào là R..R ... L., Thì đầu ra sẽ là RRRRR.LL.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- N:=kích thước của chuỗi
- movement:=mảng có kích thước N, điền vào các chữ số 0
- m:=0
- đối với tôi trong phạm vi từ 0 đến N, thực hiện
- nếu chuỗi [i] giống với 'R', thì
- m:=N
- ngược lại khi chuỗi [i] giống với 'L', thì
- m:=0
- nếu không,
- m:=tối đa là m - 1, 0
- chuyển động [i]:=chuyển động [i] + m
- nếu chuỗi [i] giống với 'R', thì
- m:=0
- đối với tôi trong phạm vi N - 1 đến -1, giảm đi 1, thực hiện
- nếu chuỗi [i] giống với 'L', thì
- m:=N
- ngược lại, khi chuỗi [i] giống với 'R', thì
- m:=0
- nếu không,
- m:=tối đa là m - 1, 0
- chuyển động [i]:=chuyển động [i] - m
- nếu chuỗi [i] giống với 'L', thì
- return tạo một chuỗi bằng cách thêm dấu chấm nếu m bằng 0, ngược lại là 'R' khi m> 0, ngược lại là 'L' cho mọi phần tử m đang chuyển động.
Mã mẫu
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
def get_final_pos(string): N = len(string) movement = [0] * N m = 0 for i in range(0, N): if string[i] == 'R': m = N elif string[i] == 'L': m = 0 else: m = max(m - 1, 0) movement[i] += m m = 0 for i in range(N - 1, -1, -1): if string[i] == 'L': m = N elif string[i] == 'R': m = 0 else: m = max(m - 1, 0) movement[i] -= m return "".join('.' if m == 0 else 'R' if m > 0 else 'L' for m in movement) print(get_final_pos('R..R...L.'))
Đầu vào
'R..R...L.'
Đầu ra
RRRRR.LL.