1. 程式人生 > 其它 >0541-leetcode演算法實現之反轉字串II-reverseStrII-python&golang實現

0541-leetcode演算法實現之反轉字串II-reverseStrII-python&golang實現

給定一個字串 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
}