首页 > 编程知识 正文

python查找指定字符,最长回文子串动态规划 python

时间:2023-05-04 02:16:37 阅读:32906 作者:1121

文章目录问题背景的思考代码

问题背景

给定回文串不管是正读还是反读都相同的字符串,例如xyx和xyyx 问题字符串s,以查找s中的最长回文子串

s=‘asdfxxyxxhjkl’时,最长回文子串为‘xx yxx’

想法从中间向两边扩展

吓得发抖

如s='abcxyxsed ',存在的最长回文子串是' xyx ',遍历字符串si=0,s[i]='a ',向两侧扩展,左边已经是边界,不能进行,最后遍历I='=s[i 1],以s[i]为中心的子串不是回文串,而是后面遍历i=3,s[i]='x '向两侧扩展,s[i-1]!=s[i 1],以s[i]为中心的子串不是回文串,而是后面遍历i=4,s[i]='y '向两侧扩展,以s[i-1]=s[i 1],s[i]为中心的长度为3的子串这次找到了句子部分列,不知道这个列是不是最长。 i=5,将s[i]='x '再向后遍历,向两侧展开,则s[i-1]!=s[i 1],以s[i]为中心的子串不是回文串,而是后面的子串……即使扫描到最后,也找不到其他回文子串,知道在i=4中找到的最长,返回结果; 然后,如果找到其他子字符串,则必须比较两者的长度大小并选择最大的返回。

刚才我们谈到了回文串长度为奇数的情况,但对于回文串长度为偶数的情况,如“‘abxyyxcd”,上述方法是不行的,所以

再举一个栗子

如果s='abcxyyxsed ',则存在的最长回文子串为' xyyx ',遍历字符串si=0,j=i 1=1,s[i]='a ',s[j]='b ',s[i]! 以=s[j]、s[i]、s[j]为中心的子串不是回文串,而是i=1,j=i 1=2,s[i]='b ',s[j]='c ',s[i]! 以=s[j]、s[i]、s[j]为中心的子串不是回文串,而是i=2,j=i 1=3,s[i]='c ',s[j]='x ',s[i]! 以=s[j]、s[i]、s[j]为中心的子串不是回文串,而是i=3,j=i 1=4,s[i]='x ',s[j]='y ',s[i]! 以=s[j]、s[i]、s[j]为中心的子串不是回文串,而是在i=4,j=i 1=5,s[i]='y ',s[j]='y ',s[i]=s[j]之后这次找到了句子部分列,不知道这个列是不是最长。 i=5,j=i 1=6,s[i]='y ',s[j]='x ',s[i]!=以s[j]、s[i]、s[j]为中心的子字符串不是回文串,而是后面的子字符串……扫描到最后,但没有找到其他的子字符串,知道在i=4中找到的是最长的,返回结果; 然后,如果找到其他子字符串,则必须比较两者的长度大小并选择最大的返回。

上面的罗瑞公开地说,但只要帮助理解,代码实现就如下。

寻找代码#s中的最长回文子串deflongestpalindrome(s ) : RES=' foriinrange (len ) s ) )以s[i]为中心的最长回文子串s1=palindrome(s ) i 1) #比较找到的回文子串的长度,最长的RES=RESiflen(RES ) len ) S1 ) else S1 RES=resi flen (RES ) len ) S2returnRES#表示s中的l, 寻找以r为中心的最长回文子串defpalindroor ) :whilel=0andRlen(s(ands(l )=s(r ) :l-=1r=1returns(l1:r )

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。