算法練習每日一題:字母移位【Python】

848. 字母移位

有一個由小寫字母組成的字符串 S,和一個整數數組 shifts。

我們將字母表中的下一個字母稱爲原字母的 移位(由於字母表是環繞的, ‘z’ 將會變成 ‘a’)。

例如·,shift(‘a’) = ‘b’, shift(‘t’) = ‘u’,, 以及 shift(‘z’) = ‘a’。

對於每個 shifts[i] = x , 我們會將 S 中的前 i+1 個字母移位 x 次。

返回將所有這些移位都應用到 S 後最終得到的字符串。

示例:

輸入:S = “abc”, shifts = [3,5,9]
輸出:“rpl”
解釋:
我們以 “abc” 開始。
將 S 中的第 1 個字母移位 3 次後,我們得到 “dbc”。
再將 S 中的前 2 個字母移位 5 次後,我們得到 “igc”。
最後將 S 中的這 3 個字母移位 9 次後,我們得到答案 “rpl”。

提示:

1 <= S.length = shifts.length <= 20000
0 <= shifts[i] <= 10 ^ 9

鏈接:https://leetcode-cn.com/problems/shifting-letters

題解分析:

  • 簡單講就是根據 shift 的索引和值移動 S,2 個步驟:
  1. 根據索引分片 S

  2. 根據值移動分片的 s, 如果 s 長度大於1, 則要對每個字符移動

但是嵌套處理會超時!

注意情況:S 都是 ANSCII, 都是小寫字母,只要對應的加減; 但存在疊加情況
S 和 shift 長度相同;
字母表的循環可以通過 mod 計算: %26

# 嵌套循環會出現超時
class Solution:
    def shiftingLetters(self, S, shifts):
        if not S or not shifts:
            return None
        for i in range(0, len(shifts)):
            S = ''.join([chr((ord(s)-97 + shifts[i]%26)%26 + 97) for s in S[:i+1]]) + S[i+1:]
        return S
        
# 將i,i-1 的疊加的偏移事先處理,將子問題相關性轉爲獨立的
class Solution:
    def shiftingLetters(self, S, shifts):
        if not S or not shifts:
            return None
        for i in range(len(shifts)-1, 0, -1):  # 事先完成疊加計算
            shifts[i-1] += shifts[i] 

        return ''.join([chr((ord(S[i])-97 + shifts[i])%26 + 97) for i in range(len(S))])  # 遍歷偏移
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章