文章目录问题背景的思考代码
问题背景
给定回文串不管是正读还是反读都相同的字符串,例如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 )