回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str
(Str的长度 <= 1000)
,输出Str里最长回文子串的长度L。例如Str='daabaac',则
子串'aabaa'是最长回文子串,因此
输出L=5
。题目可参考
分析:
如果Str本身是回文串,那么显然L=len(Str)。如果不是,那么尝试Str[:len(Str)-1](Python的切片
http://saltriver.blog.163.com/blog/static/2260971542016525103755389/
),这样不断反向推进,如果是回文串,那么就不用再往下了,因为即使后面仍有回文串,显然长度没这个大。但这是索引值0为起点的最长回文子串,不同的索引值起点回文串可能会不一样,长度也可能会有区别,所以这是一个两层循环。看代码:
# coding=utf-8
def is_palindrome(s): # 判断是否为回文串
return s == s[::-1]
Str = input()
StrLength, L = len(Str), 0
for i in range(StrLength):
for j in range(StrLength - 1, i - 1, -1): # 从串尾向索引i反向推进
if Str[i] == Str[j]: # 回文串首尾字符相同
if is_palindrome(Str[i:j + 1]):
if j - i + 1 > L:
L = j - i + 1
break # 已找到索引值i下最长回文串
print(L)
给出一个Str的测试用例,长度为1000。
ACBCCBCBCAABBBBBACBACCBACAAACABBAACCBBBCCCCBCCABCBAAACCBBBCCACCCCCBACCCBBCAACCAACCBAAAAAAABABBBAAACABCBABCCBCCBBBCABABCBCAABACCCBACCCACABBCABBBBCCCCBCCBABBACCCCCCABCBBACCACCBAABBCAACBBAABBCBABBAABBCBABBCBCCCCBACAACCABCBBCABBBBBBABCBABCBCABABCABCABCBAACBCBBCBCBBABCBACCCAABAAAACACBACAABCABABCBAACABBABABCAACBBBBBCCAABCBBBABCBBBAAACBAAAABAACCBCCCCABCCAAAABACCACBBAABCACBABBCBCCBCCBBAAACCBABCABCBBAABACBACCACBBBCCACBBBBCACBAABCCCBCBBCBAAAABAAACCCAACACABBBABBABCBCCCCACBCBABACABBABBBACBCAABBBBACBCABAABBCCBCCBBBBCBBCAAABABCAAACACBACABCCACAACACBACBABCABACABCACBBBACBBABBBCBCABCCBAACCBCBBBBBAACACBACCABBABACCCAAABAABCCCABCACCAAAAABAACABBBABABCBABCCCBCCBCBBBCAACCCBBAACABABBBACCBCBBBACBCCAACACBCBACACABCCAABACCCBCCCCBBCACACBABBCBACABCCCBBCBCBABBBACBACBCAACCBBCCBCBCBCAACAACBABCACCBCBAABBBCCAACACBCBCCBCCBACCACBABBCBACBBBABBABCABCCBABAABACAABABACCCACCBAABBAABCACABACCCBBCCAAACACBACACCAABACBCBBCABBBBAACBBACBACCBBCAAACBBCBBACBBBAACBCBBAACBCBCABAABBACCBAACBBCBCBAACAACABAAABBCCACCCACBBAABBBCBAABAACBBABBAACCABA
输出结果为L = 14。
运行时间大约1秒,因为双层for循环,再加判断回文运算,时间复杂度为O(N**3),
对于更大长度的字符串,
显然需要更快的方法。