翻转字符串&翻转单词

一、翻转字符串

问题描述

请实现⼀个算法,在不使⽤额外数据结构和储存空间的情况下,翻转⼀个给定的字符串(可以使⽤单个过程变量)。

解题思路

由于不允许使用额外的数据接口和存储空间,所以我们将⼀个字符串以中间字符为轴,前后翻转,也就是将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
}

力扣:https://leetcode.cn/problems/reverse-words-in-a-string-iii/solutions/1925671/-by-gracious-vvilson1bb-cp35/

posted @ 2024-12-19 16:56  知道了呀~  阅读(3)  评论(0编辑  收藏  举报