给定一个字符串S,对字符串循环左移m位,要求时间复杂度为O(n),空间复杂度为O(1)

分析:首先,循环左移的意思类似于二进制串的循环左移,对于给定的字符串S(此处的字符串仅是指字符组成的串,并不是指编程语言中的字符串类型,因为大部分编程语言中的字符串类型是无法对字符串的某一字符进行修改的,只能对整个串进行修改),如S=‘abcdefghijkl’,对其循环左移3位,则变为S=‘defghijklabc’。通过对例子分析,循环左移3位等价于循环右移了len(S)-3=9位。
其次,其要求空间复杂度为O(1),因此不能通过对字符串分段复制再拼接的方式实现,因为该种方法的空间复杂度为O(n).
最后,具体的实现方式与采用的数据结构有关系,若对字符串的存储是通过链表进行的,则实现循环左移的方式很简单,只需将第m+1个节点变为链首,前m个节点拼接到最后一个节点后面即可。
如果字符串是通过数组的方式进行存储,则可采用三次反转的方式,首先分别对前m个字符、后n-m个字符进行反转(n为字符串长度),然后对整个串再次进行反转即可。
python代码实现如下:

def swap(chuan,start,end):    
    while start<end:
        temp = chuan[start]
        chuan[start]=chuan[end]
        chuan[end]=temp
        start+=1
        end-=1
    return chuan

def main():
    chuan = ['a','b','c','d','e','f','g','h','i','j','k','l']
    m=4
    chuan = swap(chuan,0,m-1)
    chuan = swap(chuan,m,len(chuan)-1)
    chuan = swap(chuan,0,len(chuan)-1)
    print(chuan)
    
if __name__=='__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值