Python修改後字串的最終狀態


假設我們有一個字串 S。長度為 n。這些 n 個盒子彼此相鄰,位置 i 處的字元 R 表示第 i 個盒子被推向右側。類似地,位置 i 處的 L 表示第 i 個盒子被推向左側,點“.”表示空位。從初始配置開始,在每個時間單位,一個被推向右側的盒子能夠將下一個盒子推向右側,同樣的操作也可以應用於左側。我們必須找到所有盒子在不再可行移動時的最終位置。

因此,如果輸入類似於 R..R...L.,則輸出將為 RRRRR.LL。

為了解決這個問題,我們將遵循以下步驟:

  • N := 字串的大小
  • movement := 大小為 N 的陣列,填充為 0
  • m := 0
  • 對於 i 從 0 到 N 的範圍,執行以下操作:
    • 如果 string[i] 與 'R' 相同,則
      • m := N
    • 否則,如果 string[i] 與 'L' 相同,則
      • m := 0
    • 否則,
      • m := 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 := m - 1 和 0 的最大值
    • movement[i] := movement[i] - m
  • 返回透過新增點(如果 m 為 0)或 'R'(如果 m > 0),否則為每個元素 m 在 movement 中新增 '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.

更新於: 2020年8月28日

106 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.