翻转字符串&翻转单词
一、翻转字符串
问题描述
请实现⼀个算法,在不使⽤额外数据结构和储存空间的情况下,翻转⼀个给定的字符串(可以使⽤单个过程变量)。
解题思路
由于不允许使用额外的数据接口和存储空间,所以我们将⼀个字符串以中间字符为轴,前后翻转,也就是将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)-1 for last >first { s[first],s[last] = s[last],s[first] first++ last-- } return s }
等风起的那一天,我已准备好一切