สมมติว่าเรามีสตริง S ความยาวคือ n กล่อง n ช่องติดกัน ตัวอักษร R ที่ตำแหน่ง i แทนว่ากล่องที่ i ถูกผลักไปทางขวา ตัวอักษร L ที่ตำแหน่ง i แทนว่ากล่องที่ i ถูกผลักไปทางซ้าย จุด '.' แทนพื้นที่ว่าง เริ่มจากการตั้งค่าเริ่มต้น ที่ทุกหน่วยเวลา กล่องที่ถูกผลักไปขวาสามารถผลักกล่องถัดไปไปขวาได้ การกระทำเดียวกันใช้ได้กับด้านซ้าย เราต้องหาตำแหน่งสุดท้ายของกล่องทั้งหมดเมื่อไม่มีการเคลื่อนไหวที่เป็นไปได้อีก
ตัวอย่าง
หากอินพุตคือ R..R...L. ผลลัพธ์จะเป็น RRRRR.LL.
ขั้นตอนการแก้ปัญหา
N:= ความยาวของสตริงmovement:= อาร์เรย์ขนาดNเติมด้วย 0m:= 0- ลูป
iจาก 0 ถึงN:- ถ้า
string[i] == 'R'ให้m := N - อื่นๆ ถ้า
string[i] == 'L'ให้m := 0 - อื่นๆ ให้
m := max(m - 1, 0) movement[i] := movement[i] + m
- ถ้า
m:= 0- ลูป
iจากN - 1ถึง -1 ลดทีละ 1:- ถ้า
string[i] == 'L'ให้m := N - อื่นๆ ถ้า
string[i] == 'R'ให้m := 0 - อื่นๆ ให้
m := max(m - 1, 0) movement[i] := movement[i] - m
- ถ้า
- คืนค่าสตริงโดยเพิ่มจุดถ้า
m == 0ไม่เช่นนั้น'R'เมื่อm > 0ไม่เช่นนั้น'L'สำหรับทุกองค์ประกอบmในmovement
การใช้งาน
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.'))
อินพุต
'R..R...L.'
เอาต์พุต
RRRRR.LL.