题目链接: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)