翻转字符串
翻转字符串单词顺序
【题目】
给定一个字符类型的数组chas,请在单词间做逆序调整。只要做到单词顺序逆序即可,对空格的位置没有特别要求。
【举例】
如果把chas看作字符串为"dog loves pig",调整成"pig loves dog"。
如果把chas看作字符串为"I’m a student.",调整成"student. a I’m"。
【要求】
如果chas长度为N,两道题都要求时间复杂度为
O
(
N
)
O(N)
O(N),额外空间复杂度为
O
(
1
)
O(1)
O(1)。
算法思路
解题思路:先将字符串整体翻转,再将每个单词翻转。
e.g. “dog loves pig” -> “gip sevol god” -> “pig lovel dog”
“I’m a student.” -> “.tneduts a m’I” -> “student. a I’m”
相应代码
# 翻转字符串单词顺序
def reverse_word(arr):
if arr is None or len(arr) == 0:
return arr
reverse(arr, 0, len(arr) - 1)
start = -1
end = -1
for i in range(len(arr)):
# 遇见' ',将前面start至end的字符翻转
if arr[i] == ' ':
reverse(arr, start, end)
start = -1
end = -1
else:
if start == -1:
start = i
end = i
else:
end += 1
# 翻转最后一个单词
reverse(arr, start, end)
# 字符串整体翻转
def reverse(arr, start, end):
while start < end:
temp = arr[start]
arr[start] = arr[end]
arr[end] = temp
start += 1
end -= 1
# 简单测试
if __name__ == '__main__':
s = "dog"
chas = list(s)
reverse_word(chas)
print(''.join(chas)) # "dog"
s = "dog loves pig"
chas = list(s)
reverse_word(chas)
print(''.join(chas)) # "pig Loves dog"
s = "I’m a student."
chas = list(s)
reverse_word(chas)
print(''.join(chas)) # "student. a I'm"
字符串整体移动
【题目】
给定一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体移到右半区,右半区整体移到左边。
【举例】
如果把chas看作字符串为"ABCDE",size=3,调整成"DEABC"。
【要求】
如果chas长度为N,两道题都要求时间复杂度为
O
(
N
)
O(N)
O(N),额外空间复杂度为
O
(
1
)
O(1)
O(1)。
算法思路
解题思路:先将字符串整体翻转,再将右半区和左半区分别翻转。
e.g. “ABCDE” -> “EDCBA” -> “DEABC”
相应代码
# 字符左右互移
def left_recur_size(arr, size):
if arr is None or len(arr) == 0:
return arr
reverse(arr, 0, len(arr) - 1) # 整体翻转
reverse(arr, 0, len(arr) - size - 1) # 左半区翻转
reverse(arr, len(arr) - size, len(arr) - 1) # 右半区翻转
# 字符串整体翻转
def reverse(arr, start, end):
while start < end:
temp = arr[start]
arr[start] = arr[end]
arr[end] = temp
start += 1
end -= 1
# 简单测试
if __name__ == '__main__':
s = "ABCDE"
chas = list(s)
size = 3
left_recur_size(chas, size)
print(''.join(chas)) # "DEABC"
有任何疑问和建议,欢迎在评论区留言和指正!
感谢您所花费的时间与精力!