假设我们有一个字符串S。长度为n。这n个框彼此相邻,位置i处的字符R表示第i个框正向右推动。类似地,位置i处的L表示第i个框被推向左侧,即点“”。表示空白。从初始配置开始,在每个时间单位,向右推动的盒子都可以向右推动下一个盒子,同样的动作也可以应用于左侧。当没有其他动作可行时,我们必须找到所有盒子的最终位置。
因此,如果输入类似于R..R ... L。,则输出将为RRRRR.LL。
为了解决这个问题,我们将遵循以下步骤-
N:=字符串大小
运动:=大小为N的数组,以0s填充
m:= 0
对于0到N范围内的i,执行
m:= m-1,0的最大值
m:= 0
m:= N
如果string [i]与'R'相同,则
否则,当string [i]与'L'相同时,则
除此以外,
运动[i]:=运动[i] + m
m:= 0
对于范围在N-1到-1的i,将其减小1,
m:= m-1,0的最大值
m:= 0
m:= N
如果string [i]与“ L”相同,则
否则,当string [i]与'R'相同时,则
除此以外,
运动[i]:=运动[i]-米
如果m为0,则通过加点来返回字符串;如果m> 0,则为'R';否则,对于运动中的每个元素m为'L'。
让我们看下面的实现以更好地理解-
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.