Python数据结构与算法-字符串

本文介绍了Python中字符串处理的一些重要概念和算法,包括字符串的循环左移和全排列,以及文本串与模式串的匹配方法,如BF暴力搜索和KMP算法。此外,还探讨了字符串相乘、寻找最长无重复子串的最大长度,以及整数和罗马数字之间的相互转化问题。最后,讨论了如何找到最长的回文子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:字符串的循环左移

给定一个字符串s[0..........N-1],要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符'a','b'移动到字符串的尾部得到'cdefab',即左移k

循环左移k=循环右移n-k

核心公式:XY to YX

(X'Y')'=YX

def stringLeftReverse(s,n,k):
    s=[i for i in s] #转化为列表
    s=transportation(s,0,k-1) #X'
    s=transportation(s,k,n-1) #Y'
    s=transportation(s,0,n-1) #(X'Y')'
    s=''.join(s) #将字符串列表转化为字符串
    
    return s
    
#转置函数     
def transportation(s,left,right): #字符串子序列的转置
    while left<right:
        #首尾交换
        s[right],s[left]=s[left],s[right]#这样的操作只能是可变的序列,像字符串这样的不可修改,需要将字符串转化为列表操作,之后转化为字符串
        #指针移动
        left+=1
        right-=1
        
    return s #返回字符串本身
    




if __name__=='__main__':
    s='asdfeg'
    n=len(s)
    k=2
    print(stringLeftReverse(s,n,k))

2:字符串的全排列

给定字符串s[0....N-1],设计算法,枚举字符串的全排列

eg:1234,

1---234全排列

2---134全排列

3---124全排列

4---123全排列

由上述可知这是一个递归问题。

(1)递归法---字符串的全排列:

def  arrangementString(s,left,right):
    
    if left==right: 
        print(''.join(s)) #将列表转化为字符串
    for i in range(left,right+1): #left为当前递归序列的左边界,right为右边界
        #i表示与当前递归序列首元素left要交换的元素
        if isRepeat(s,left,i): #判断是否有重复字符 ,(left,i)注意这里要查询的范围
            continue
        s[i],s[left]=s[left],s[i]
        arrangementString(s,left+1,right) #递归全排列 
        s[i],s[left]=s[left],s[i]

        
def isRepeat(s,left,right): #注意
    flag=False
    for i in range(left,right):
        if s[i]==s[right]:
            flag=True
            break
    return flag
               
        
if __name__=='__main__':
    s='ABA'
    s=[i for i in s] #将字符串转化为列表
    left=0
    right=len(s)-1
    arrangementString(s,0,right)

(2)非递归法---字符串的全排列:

思路:先找出最小的;之后依次找出他的下一个比他大的排列。

问题化解为:下一个排列问题。

下一个排列问题:思路:从最末尾向前依次查找,当不满足升序停止。之后从停止位置向后查找,找出所有大于停止位置数值的元素,且找出最小的。之后交换停止位元素和最小元素。之后翻转,停止位之后的元素。

总结为:后找,大小,交换,反转。

def arrangementString(s,left,r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值