代码随想录算法训练营第8天| 344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer 58-II.左旋转字符串

344.反转字符串 

题目链接:LeetCode - The World's Leading Online Programming Learning Platform

题目链接/文章讲解/视频讲解:代码随想录

解题思路:

左右指针 循环互换

class Solution(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        n = len(s)
        left = 0
        right = n-1
        while left <right:
            s[left],s[right]=s[right],s[left]
            left+=1
            right-=1
        return s

- 时间复杂度 O(n)

- 空间复杂度 O(1) 

541. 反转字符串II

题目链接:LeetCode - The World's Leading Online Programming Learning Platform

题目链接/文章讲解/视频讲解:代码随想录

解题思路:

先设置reverse function

因为每次都是旋转2k后的前k个 直接用for loop:for i in range(0,len(res),2*k)

trick: slicing时 list[0:inf]=list[0:]

class Solution(object):
    def reverseStr(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: str
        """
        def reverse(s):
            left=0
            right = len(s)-1
            while left < right:
                s[left],s[right]=s[right],s[left]
                left+=1
                right-=1
            return s
        
        res=list(s)
      
        for i in range(0,len(res),2*k):
            res[i:i+k]=reverse(res[i:i+k])
        return "".join(res)

- 时间复杂度 O(n)

- 空间复杂度 O(n) 

剑指Offer 05.替换空格 

题目链接/文章讲解:代码随想录

解题思路:

暴力解题

def replaceSpace(self, s):
        """
        :type s: str
        :rtype: str
        """
        return "%20".join(s.split(" "))

- 时间复杂度 O(?)

- 空间复杂度 O(?) 

extension:

如果想要减少空间开销 那就使用双指针

先扩大空间 再从最后开始调转指针

class Solution:
    def replaceSpace(self, s: str) -> str:
        counter = s.count(' ')
        
        res = list(s)
        # 每碰到一个空格就多拓展两个格子,1 + 2 = 3个位置存’%20‘
        res.extend([' '] * counter * 2)
        
        # 原始字符串的末尾,拓展后的末尾
        left, right = len(s) - 1, len(res) - 1
        
        while left >= 0:
            if res[left] != ' ':
                res[right] = res[left]
                right -= 1
            else:
                # [right - 2, right), 左闭右开
                res[right - 2: right + 1] = '%20'
                right -= 3
            left -= 1
        return ''.join(res)

- 时间复杂度 O(n)

- 空间复杂度 O(1) 

151.翻转字符串里的单词 

题目链接:LeetCode - The World's Leading Online Programming Learning Platform

题目链接/文章讲解/视频讲解:代码随想录

暴力解题:

.split()可以truncate all heading/trailing/duplicate space characters

class Solution(object):
    def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """
        array=s.split()
        array=array[::-1]
        return " ".join(array)

- 时间复杂度 O(?)

- 空间复杂度 O(?) 

剑指Offer58-II.左旋转字符串 ​​​​​​​

题目链接/文章讲解:代码随想录

解题思路:

暴力解题

class Solution(object):
    def reverseLeftWords(self, s, n):
        """
        :type s: str
        :type n: int
        :rtype: str
        """
        s=s[n:]+s[0:n]
        return s

神奇的解法左旋转 此解法用于不准使用额外开销(没有用buildin function)

先分开翻转前后两部分

再旋转整个list

class Solution(object):
    def reverseLeftWords(self, s, n):
        """
        :type s: str
        :type n: int
        :rtype: str
        """
        def reverse(x):
            res=list(x)
            left=0
            right=len(res)-1
            while left<right:
                res[left],res[right]=res[right],res[left]
                left+=1
                right-=1
            return ''.join(res)
        s1=reverse(s[0:n])
        s2=reverse(s[n:])
        s=reverse(s1+s2)
        return s

- 时间复杂度 O(n)

- 空间复杂度 O(1) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值