文章目录
- 05. 替换空格
- 分析
- 代码(replace)
- 通过截图
- 代码(双指针法:开辟空格个空间 )
- 通过截图
- 代码(双指针法:开辟空格个*2的空间)
- 通过截图
- 代码(循环遍历)
- 通过截图
- 151. 翻转字符串里的单词
- 分析
- 代码(split)
- 通过截图
- 代码(双指针)
- 通过截图
替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
0 <= s 的长度 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
- 1.直接用replace方法,str.replace(old, new[, max])
- 2.双指针法(开辟空格个空间):字符串是不可变的,现将字符串转为列表,在列表开辟空格个空间,然后从后到前填充(python字符串是可以存在一个列表空间的,所以开辟这些空间是肯定够用的),left指针最先开始指在字符串最后一位,right指针指在开辟完后在空间最后一位,left不断向左遍历,是空格就在右指针所指向的数变为%20
- 3.双指针法(开辟空格个2的空间):字符串是不可变的,现将字符串转为列表,在列表开辟空格个2的空间,然后从后到前填充(假如空间利用率为全部),left指针最先开始指在字符串最后一位,right指针指在开辟完后在空间最后一位,left不断向左遍历,是空格就在右指针所指向的数先后变为0,2,%
- 4.循环遍历,找到就替换
代码(replace)
class Solution:
def replaceSpace(self, s: str) -> str:
s = s.replace(" ","%20")
return s
通过截图
代码(双指针法:开辟空格个空间 )
class Solution:
def replaceSpace(self, s: str) -> str:
num = s.count(" ")
s_list = list(s)
s_list.extend([' '] * num)
left,right = len(s)-1,len(s_list)-1
while left >= 0:
if(s_list[left] != " "):
s_list[right] = s_list[left]
else:
s_list[right] = "%20"
left-=1
right-=1
return "".join(s_list[num:])
通过截图
代码(双指针法:开辟空格个*2的空间)
class Solution:
def replaceSpace(self, s: str) -> str:
num = s.count(" ")
s_list = list(s)
s_list.extend([' '] * (num * 2))
left,right = len(s)-1,len(s_list)-1
while left >= 0:
if(s_list[left] != " "):
s_list[right] = s_list[left]
else:
s_list[right] = "0"
right-=1
s_list[right] = "2"
right-=1
s_list[right] = "%"
left-=1
right-=1
return "".join(s_list)
通过截图
代码(循环遍历)
class Solution:
def replaceSpace(self, s: str) -> str:
s_list = list(s)
for index,data in enumerate(s_list):
if data == " ":
s_list[index] = "%20"
return "".join(s_list)
通过截图
151. 翻转字符串里的单词
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"
示例 2:
输入:s = " hello world "
输出:"world hello"
解释:输入字符串可以在前面或者后面包含多余的空格,但是翻转后的字符不能包括。
示例 3:
输入:s = "a good example"
输出:"example good a"
解释:如果两个单词间有多余的空格,将翻转后单词间的空格减少到只含一个。
示例 4:
输入:s = " Bob Loves Alice "
输出:"Alice Loves Bob"
示例 5:
输入:s = "Alice does not even like bob"
输出:"bob like even not does Alice"
提示:
1 <= s.length <= 104
s 包含英文大小写字母、数字和空格 ' '
s 中 至少存在一个 单词
进阶:
请尝试使用 O(1) 额外空间复杂度的原地解法。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
1.运行字符串内置的方法split进行分割,返回值是list,使得每个单词都在一个列表的空间里面(被分割开),然后将列表内部元素顺序颠倒,最后通过join和空格重新拼接即可
2.先去掉多余的空格(最前最后的空格strip方法即可),再去除中间的多余空格(双指针法),再将所有字符顺序颠倒。再利用左右指针看到空格或者右指针已到最后,颠倒字符串。(第一次颠倒所有字符,第二次颠倒每个单词的字符串)
代码(split)
class Solution:
def reverseWords(self, s: str) -> str:
t = s.split()
left,right = 0,len(t)-1
while left < right:
t[left],t[right] = t[right],t[left]
left+=1
right-=1
return " ".join(t)
通过截图
代码(双指针)
class Solution:
def reverseWords(self, s: str) -> str:
# 去除多余空格
s = s.strip() # 删除首尾空格,形参默认为空格
l = list(s)
left = right = 0
# 去除中间的空格
while 1:
right += 1
left += 1
if right == len(l):
break
while l[right] == " " and l[right + 1] == " ":
right += 1
l[left] = l[right]
l = l[0:left]
# 翻转字符串
left,right = 0,len(l)-1
while left < right:
l[left],l[right] = l[right],l[left]
left+=1
right-=1
# 翻转每个单词
left,right = 0,0
while 1:
right+=1
if right == len(l) or l[right] == " ":
x = right # 存储空格下标或者长度值
right-=1
while(left < right):
l[left],l[right] = l[right],l[left]
left+=1
right-=1
if x == len(l):
break
else:
left,right = x+1,x+1
return "".join(l)
通过截图