一、翻转字符串
问题描述
请实现⼀个算法,在不使⽤额外数据结构和储存空间的情况下,翻转⼀个给定的字符串(可以使⽤单个过程变量)。
解题思路
由于不允许使用额外的数据接口和存储空间,所以我们将⼀个字符串以中间字符为轴,前后翻转,也就是将str[len]
赋值给str[0]
,将str[0]
赋值str[len]
。
func revertStr(str string) string {arr := []byte(str)n := len(str)for i := 0; i < n/2; i++ {arr[i], arr[n-i-1] = arr[n-i-1], arr[i]}return string(arr) }
二、前k个字符翻转
题解:反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。
复杂度:
-
时间复杂度:O(n),其中 n 是字符串 s 的长度。
-
空间复杂度:O(1)
func reverseStr(s string, k int) string {t := []byte(s)for i := 0; i < len(s); i += 2 * k {sub := t[i:min(i+k, len(s))]for j, n := 0, len(sub); j < n/2; j++ {sub[j], sub[n-1-j] = sub[n-1-j], sub[j]}}return string(t) }func min(a, b int) int {if a < b {return a}return b }
力扣:https://leetcode.cn/problems/reverse-string-ii/description/
三、字符串单词翻转
题解: 在一的基础上,先按空格分隔单词,然后逐个翻转拼接即可
时间复杂度:
func reverseWords(s string) string {s1 :=strings.Split(s," ")for k,_:=range s1 {s1[k] =string(reverse([]byte(s1[k])))}return strings.Join(s1," ") }//对byte进行翻转 func reverse(s []byte) []byte{first,last:=0,len(s)-1for last >first {s[first],s[last] = s[last],s[first]first++last--}return s }
力扣:https://leetcode.cn/problems/reverse-words-in-a-string-iii/solutions/1925671/-by-gracious-vvilson1bb-cp35/