0541-leetcode演算法實現之反轉字串II-reverseStrII-python&golang實現
阿新 • • 發佈:2021-10-25
給定一個字串 s 和一個整數 k,從字串開頭算起,每計數至 2k 個字元,就反轉這 2k 字元中的前 k 個字元。
如果剩餘字元少於 k 個,則將剩餘字元全部反轉。
如果剩餘字元小於 2k 但大於或等於 k 個,則反轉前 k 個字元,其餘字元保持原樣。
示例 1:
輸入:s = "abcdefg", k = 2
輸出:"bacdfeg"
示例 2:
輸入:s = "abcd", k = 2
輸出:"bacd"
提示:
1 <= s.length <= 104
s 僅由小寫英文組成
1 <= k <= 104
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/reverse-string-ii
python
# 反轉字串1 def reverse(s_list, l, r): while l < r: temp = s_list[l] s_list[l] = s_list[r] s_list[r] = temp l += 1 r -= 1 class Solution: def reverseStrII(self, s: str, k: int): """ 雙指標法, 時間O(n), 空間O(n) -> s>list, O(n)空間 :param s: :param k: :return: """ s_list = list(s) n = len(s_list) for l in range(0, n-1, 2*k): r = l + k -1 reverse(s_list, l, min(r, n-1)) return ''.join(s_list) if __name__ == "__main__": s = 'legendABC' k = 3 test = Solution() print(test.reverseStrII(s, k))
golang
package main import "fmt" func main() { s := "lengendABC" k := 3 fmt.Println(reverseStrII(s, k)) } func reverseStrII(s string, k int) string { t := []byte(s) n := len(t) for l := 0; l < n-1; l += 2 * k { r := l + k - 1 reverse(t, l, min(r, n-1)) } return string(t) } func reverse(ss []byte, l, r int) { for l < r { ss[l] ^= ss[r] ss[r] ^= ss[l] ss[l] ^= ss[r] l++ r-- } } func min(a, b int) int { if a < b { return a } return b }