*32/85 字符串运用-密码截取

该博客主要讲述了如何帮助情报员Catcher找出截获的字符串中,最长的对称密码串。问题涉及对回文串的识别,提出了两种思路:一是从每个字符或空隙出发向左右扩充寻找最大长度;二是通过逐字符扫描,判断以当前字符结尾的长度加一或加二的子串是否为回文。目的是解决在长字符串中高效识别有效密码串的问题。

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

题目描述
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
输入描述:
输入一个字符串
输出描述:
返回有效密码串的最大长度
示例1
输入
ABBA
输出
4
思路1:
以每个字符(奇数长度的回文串)或者字符间空隙(偶数长度的回文串)分别向左右扩充,记录遇到的最大长度
先考虑奇数个数的回文串,再考虑偶数个数的回文串。

while True:
    try:
        s=input()
        if s==s[::-1]:
            maxlength=len(s)
        else:
            maxlength=0
            for i in range(len(s)):#寻找以i-1,i为中点的偶数字符串长度
                low=i-1
                high=i
                while (low>=0 and high<len(s) and s[low]==s[high]):
                    low-=1
                    high+=1
                if high-low-1>maxlength:
                    maxlength=high-low-1
                low=i-1#寻找以i为中点的奇数字符串长度
                high=i+1
                while(low>0 and high<len(s) and s[low]==s[high]):
                    low-=1
                    high+=1
                if high-low-1>maxlength:
                    maxlength=high-low-1
        print(maxlength)
    except:
        break

思路2:
理论支持:每当增加一个新的字母,最大回文串的长度只能增加1或者2,不可能增加更多,并且,新的最大回文串必然要包含这个字母!
所以,从头到尾扫描字符串,每增加一个新的字符,判断以这个字符结尾,且长度为maxLen+1或者maxLen+2的子串是否为回文,如果是,更新最大回文子串。代码如下:

def longeststring(string):
    if string[::-1]==string:
        return len(string)
    maxlength=0
    for i in range(len(string)):
        if i-maxlength>=1 and string[i-maxlength-1:i+1]==string[i-maxlength-1:i+1][::-1]:
            maxlength+=2
            continue
        if i-maxlength>=0 and string[i-maxlength:i+1]==string[i-maxlength:i+1][::-1]:
            maxlength+=1
    return maxlength
while True:
    try:
        string=input()
        if string:
            print(longeststring(string))
    except:
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值