字符串|344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串
文档链接:代码随想录
做题感悟:
- 反转字符串:使用双指针,交换指针指向的字符。
- 反转字符串II:不同之处在于,需要反转的字符串需要提前取出,这里只用切片取可以避免一些边界问题。切片越界会直接默认访问最末尾的元素。s[0:len(s)-1]对应的是[0,len(s)-1)的元素,切片是左闭右开。
- 替换空格,重点是字符串要变成列表才能修改
- 反转字符串里的单词,通过利用快慢指针覆盖剔除多余的空格,利用双指针实现对字符串的反转,同时借助另外一个双指针定位每个单词的首尾。
- 左旋转字符串:先反转前半段,后反转后半段,最后整体反转。
题目一:344.反转字符串——15min
- 使用双指针对字符串两端字符进行交换
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
# 使用双指针两两交换
# 初始化双指针
left = 0
right = len(s)-1
# 移动双指针
while right > left:
temp = s[left]
s[left] = s[right]
s[right] = temp
left += 1
right -= 1
return s
题目二:541.反转字符串II—40min
- 首先字符串不是列表,不能索引,不可变类型。
- 先将需要反转的字符串切出来,再进行反转。
- 将列表转为字符串
join(s)
可以将s中的元素合并成字符串
class Solution:
def reverseStr(self, s: str, k: int) -> str:
# 先计算出双指针可能的起始位置
# 再更新双指针位置,逐一进行反转
s=list(s) #将字符串强制类型转换,字符串必须变成list才能索引
L = len(s)
n = L // (2*k)
i = 0
while i <= n:
if L - 2*k*i >= k:# 先对前面的2k*n+k个字符进行处理
left = 2*k*i
right = 2*k*i+k-1
else:# 对剩下的字符进行处理
left = 2*k*i
right = L-1
while left < right:
temp = s[left]
s[left] = s[right]
s[right] = temp
right -= 1
left += 1
i += 1
return ''.join(s) #字符串列表s连接成一个单独的字符串并返回
'''
它使用了Python的内置函数join(),它可以将一个可迭代对象(如列表)中的元素用一个指定的分隔符连接成一个字符串。如果您不想要任何分隔符,您可以用空字符串’‘作为参数。例如,join(s)等价于’'.join(s)。
'''
- 这里其实用切片更好,当切片访问越界时,默认访问到列表的最后一个元素,不会越界
class Solution:
def reverseStr(self, s: str, k: int) -> str:
"""
1. 使用range(start, end, step)来确定需要调换的初始位置
2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
3. 用切片整体替换,而不是一个个替换.
"""
def reverse_substring(text):
left, right = 0, len(text) - 1
while left < right:
text[left], text[right] = text[right], text[left]
left += 1
right -= 1
return text
res = list(s)
for cur in range(0, len(s), 2 * k):
res[cur: cur + k] = reverse_substring(res[cur: cur + k])
return ''.join(res)
题目三:剑指Offer 05.替换空格——15min
- 字符串要转变成列表才能修改
- 遍历查询空格并替换
class Solution:
def replaceSpace(self, s: str) -> str:
s=list(s)
res=[]
for i in range(len(s)):
if s[i]==' ':
s[i]='%20'
print(s[i])
return ''.join(s)
题目四:151.翻转字符串里的单词——1h
- 首先使用快慢指针去除多余的空格元素。
- 使用双指针实现对整个字符串的反转。
- 使用while移动快慢指针,寻找每个单词,并调用reverse函数,实现对单词的二次翻转
class Solution:
def delspace(self,s:str) -> str:
# 使用快慢指针
# 先遍历快指针
# 现在单词前面空一个空格
# 移动快慢指针将单词拷贝
slow = 0
fast = 0
s = list(s)
while fast < len(s):
if s[fast] != ' ': # 只对非空格字符进行操作
if slow != 0 and 0 < slow < len(s):# 首先判断是不是第一个单词,如果不是,则在前面空一格
s[slow] = ' '
slow += 1
while fast < len(s) and s[fast] != ' ':# 将满足条件的单词拷贝过去,不满足条件的将会被覆盖
s[slow] = s[fast]
slow += 1
fast += 1
fast += 1
return ''.join(s[0:slow])
def reverse(self,nums:list) -> list:
#用于反转
left = 0
right = len(nums)-1
while left < right:
temp = nums[left]
nums[left] = nums[right]
nums[right] = temp
left += 1
right -= 1
return nums
def reverseWords(self, s: str) -> str:
s=list(self.delspace(s) )#先去掉多余空格
print(s)
nums= self.reverse(s)
fast = 0
slow = 0
print(nums)
while fast <= len(nums): # 移动快慢指针,反转每个单词的
if fast == len(nums) or nums[fast] == ' ' :
# 如果第一个正确就不会执行第二个,and的话如果第一个错误也不会执行第二个
print(nums[slow:fast])
nums[slow:fast]=self.reverse(nums[slow:fast])
slow=fast+1
fast += 1
return ''.join(nums)
题目五:剑指 Offer 58 - II. 左旋转字符串——20min
- 先反转前半段
- 再反转后半段
- 最后整体在做一次反转
class Solution:
def reverse(self,nums:list) -> list:
right = len(nums)-1
left = 0
while left < right:
nums[left],nums[right] = nums[right],nums[left]
right -= 1
left +=1
return nums
def reverseLeftWords(self, s: str, n: int) -> str:
s=list(s)
s[0:n] = self.reverse(s[0:n])
s[n:len(s)] = self.reverse(s[n:len(s)])
s=s[::-1]
return ''.join(s)