Python程式:查詢應用操作後的字典序最小字串
假設我們有一個只包含數字字元的字串 s,以及兩個值 a 和 b。我們可以對 s 應用以下兩種操作中的任意一種,任意次數,並且可以按任意順序進行:
將 'a' 加到 s 的所有奇數位置的項 (從 0 開始索引)。如果數字是 9,則新增任何值後會迴圈回 0。
將 's' 向右旋轉 b 個位置。
因此,我們必須找到透過對 s 應用上述操作任意多次可以獲得的字典序最小字串。
例如,如果輸入為 s = "5323" a = 9 b = 2,則輸出為 2050,因為如果我們按照以下步驟:
- 旋轉:"5323"
- 新增:"5222"
- 新增:"5121"
- 旋轉:"2151"
- 新增:"2050"
為了解決這個問題,我們將遵循以下步驟:
- seen := 一個新的集合
- deq := 一個新的佇列,其中包含一個元素 's'
- 當 deq 不為空時,執行以下操作:
- curr := 從 deq 中刪除的第一個元素
- 將 curr 插入 seen 集合
- ad := 對 curr 執行給定的加法操作
- 如果 ad 不在 seen 中,則
- 將 ad 插入 deq 的末尾
- 將 ad 插入 seen 集合
- ro := 對 curr 執行旋轉操作
- 如果 ro 不在 seen 中,則
- 將 ro 插入 deq 的末尾
- 將 ro 插入 seen 集合
- 返回 seen 的最小值
示例
讓我們看看下面的實現,以便更好地理解:
from collections import deque def add_(s,a): res = '' for idx, i in enumerate(s): if idx % 2 == 1: num = (int(i) + a) % 10 res += str(num) else: res += i return res def rotate_(s, b): idx = len(s)-b res = s[idx:] + s[0:idx] return res def solve(s, a, b): seen = set() deq = deque([s]) while deq: curr = deq.popleft() seen.add(curr) ad = add_(curr, a) if ad not in seen: deq.append(ad) seen.add(ad) ro = rotate_(curr, b) if ro not in seen: deq.append(ro) seen.add(ro) return min(seen) s = "5323" a = 9 b = 2 print(solve(s, a, b))
輸入
"5323", 9, 2
輸出
2050
廣告