本博客的创作的算法来源于July创作的《编程之法面试和算法心得》一书,特此声明。我再学习此书的同时在结合了自己的一些理解,用python实现了一遍。在后面的系列博客中,不再重述,直接进入正题。
一、题目描述
给定一个字符串,要求字符串前面若干个字符移到字符串的尾部。例如,将字符串“abcdef”的前三个字符移到字符串的尾部,则得到“defabc”。请写一个函数实现该功能。
二、解法一:蛮力移位
假设需要移位m个字符,字符串的总长度为n,则蛮力移位需要遍历该字符串m次,将m个需要移位的字符搬到该字符串的尾部。因此可以分成两个函数实现,首先第一个函数用来搬移第一个字符到该字符串的尾部。
def LeftShiftOne(str, n):
s = []
s = list(str)
t = s[0]
for i in range(1,n):
s[i-1] = s[i]
s[n-1] = t
return s
第二个函数写个for训练遍历m次即可得到移位的字符串。
def LeftRotateString(s, n, m):
while(m):
s = LeftShiftOne(s, n)
m = m - 1
return s
该算法想法和实现都简单,但是时间复杂度比较高,为:O(mn),空间复杂度为O(1).
三、解法二:三步反转
三步反转的思维比较巧妙,做法分为三步: