代码随想录算法训练营第七天(字符串篇)|Leetcode344反转字符串,Leetcode541反转字符串II,卡码网54替换数字
Leetcode 344 反转字符串
题目链接: 反转字符串
给定一个字符串,要求输出将其反转后的结果
思路: 在部分语言中(如Java和python), 字符串不可变,此时对于字符串的修改需要用到辅助空间,这点在之后的题目中会体现。在本题中,我们既可以使用双指针从字符串两边向中间遍历,遍历过程中交换元素以反转字符串;也可以通过分片的方式(更pythonic)直接反转字符串
具体代码实现
# 双指针法
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left, right = 0, len(s)-1
while left<right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
# 分片法
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
s[:] = s[::-1]
时间复杂度: O(n)
Leetcode 541 反转字符串II
题目链接: 反转字符串II
给定一个字符串,并给定一个数值k。要求从前到后遍历字符串,每经过2k个字符时,就将前k个字符进行反转。字符串末尾处若不足2k个字符,仍然进行反转直到字符串末尾(至多k个字符)
思路: 既可以遍历字符串,每经过2k个字符就对前k个进行反转;也可以直接使用分片法直接处理
class Solution:
def reverseStr(self, s: str, k: int) -> str:
from typing import List
def reverseStrPart(text: List) -> List:
left, right = 0, len(text)-1
while left<right:
text[left], text[right] = text[right], text[left]
left += 1
right -= 1
return text
myString = list(s)
for i in range(0, len(s), 2*k):
myString[i:i+k] = reverseStrPart(myString[i:i+k])
return ''.join(myString)
class Solution:
def reverseStr(self, s: str, k: int) -> str:
# 注意到此处反转时,应该先尝试取前k个字符,即s[i:i+k],随后再进行反转[::-1],而不是直接尝试s[i:i+k:-1]
# 这样可以避免最后字符不足k个导致出错的情况
for i in range(0, len(s), 2*k):
s = s[:i] + s[i:i+k][::-1] + s[i+k:]
return s
时间复杂度: O(n)
替换数字
题目链接: 替换数字
给定一个字符串,将其中的所有数字替换为'number',如'a1b2c3'替换为'anumberbnumbercnumber'
思路: 此处我们既可以通过列表模拟字符串,先遍历一遍数组,找出数组中数字的个数。由于所有的数字都会被替换为'number',相当于每发生一次替换,字符串的长度就增加5。我们可以据此确定新字符串的长度,随后从后向前进行替换操作。还可以考虑从前向后仅遍历一遍字符串,遇到数字就进行替换。
具体代码实现:
# 利用辅助空间
def replace_num(s: str):
i, size = 0, len(s)
while i < size:
if s[i].isdigit():
s = s[:i] + 'number' + s[i+1:]
size += 5
i += 1
return s
def main():
mystring = input()
result_string = replace_num(mystring)
print(result_string)
# 通过列表模拟字符串,实现替换
def replace_num(s: str):
mylist = list(s)
new_length = len(mylist)
for i in mylist:
if i.isdigit():
new_length += 5
result = [''] * new_length
old_idx, new_idx = len(s)-1, new_length-1
while old_idx >= 0:
if not mylist[old_idx].isdigit():
result[new_idx] = mylist[old_idx]
else:
result[new_idx-5:new_idx+1] = 'number'
new_idx -= 5
old_idx -= 1
new_idx -= 1
return ''.join(result)
def main():
mystring = input()
result_string = replace_num(mystring)
时间复杂度: O(n)

浙公网安备 33010602011771号