回文,亦称回环,是正读反读都能一样的字符串。例如“12321”、“abba”等。
现在给你一个字符串,请你找出其中长度最长的回文。
输入有多组数据。
每组数据有一行,包含一个长度小于100个字符的字符串s,且仅由字母和数字构成。
如果有多个长度相等的回文,仅输出第一个。
对应每一组输入,输出其中长度最长的回文字符串。
abcabccbadda abcabccbaddabcc
abccba ccbaddabcc
#思路:动态规划 # 1、dp[i][j] = 1表示字符串s从i到j是回文串 dp[i][j] = 0表示字符串s从i到j不是回文串 # 2、如果dp[i][j] = 1, 那么dp[i+1][j-1] = 1
import sys
def manacher(s):
maxlen = 0
start = 0
dp = [[0 for i in range(len(s))] for i in range(len(s))]
for i in range(len(s)):
dp[i][i] = 1
if i+1<len(s) and s[i] == s[i+1]:
dp[i][i+1] = 1
maxlen = 2
start = i
for i in range(3,len(s)+1):
for j in range(len(s)-i+1):
k = i+j-1
if dp[j+1][k-1]==1 and s[j]==s[k]:
dp[j][k] = 1
if i>maxlen:
start = j
maxlen = i
if maxlen>=2:
return s[start:start+maxlen]
return 1
for i in sys.stdin.readlines():
print (manacher(i.strip()))
import sys
def longestPalindrome(s):
if s == s[::-1]: return s
start, maxLen = 0, 1
for i in range(len(s)):
if i - maxLen >= 1 and s[i - maxLen -1:i + 1] == s[i - maxLen - 1:i + 1][::-1]:
start = i - maxLen - 1
maxLen += 2
continue
if i - maxLen >= 0 and s[i - maxLen:i + 1] == s[i - maxLen:i + 1][::-1]:
start = i - maxLen
maxLen += 1
return s[start:start + maxLen]
for i in sys.stdin.readlines():
print (longestPalindrome(i.strip()))