思路
- 遍历字符串时,让i+2*k,然后判断是否有需要反转的区间,反转区间在[i,i+k]
法一:用单独的反转函数
体现了剩余字符小于k和剩余字符小于2k但大于或等于k的情况
class Solution:
def reverseStr(self, s: str, k: int) -> str:
res=list(s)
for i in range(0,len(s),2*k):
#剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样
if i+k < len(s):
res[i:i+k]=self.subStringReverse(res[i:i+k])
continue
#剩余字符少于 k 个,则将剩余字符全部反转
res[i:len(s)]=self.subStringReverse(res[i:len(s)])
return ''.join(res)
def subStringReverse(self,s):
start=0
end=len(s)-1
while start < end:
s[start],s[end]=s[end],s[start]
start+=1
end-=1
return s
法二:利用切片+拼接
循环条件:start<数组长度,start每次+2k
反转用s[::-1]
利用字符串特性:字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。在本题中对应,剩余字符小于k,反转剩下的全部字符。因此,不用再区分剩余字符是否小于k、剩余字符大于等于k但小于2k。
class Solution:
def reverseStr(self, s: str, k: int) -> str:
start=0
n=len(s)
#start+2k小于字符长度,表明剩余字符小于2k但大于等于k
while start < n:
#前移k个字符
end=start+k
#字符串切片后拼接,在start:end区间反转
s=s[:start]+s[start:end][::-1]+s[end:]
start=start+(2*k)
return s