解决方案1
while True: try: s = input() result = "" for i in range(len(s)): start = max(0, i-len(result)-1) temp = s[start: i+1] if temp == temp[::-1]: result = temp else: temp = temp[1:] if temp == temp[::-1]: result = temp if result: print(len(result)) except: break
- 回文性质1:
如果是回文(abcba),则去除头尾(bcb)后也是回文 ---> s[1:-1] - 回文性质2:
如果长度为奇数(abcba),则以中间数为对称(c)
如果长度为偶数(abccba),则以中线为对称点 - 所以当我们遍历s的时候:
需要判断奇偶两种情况, str[start: i+1]
解决方案2
while True: try: s = input() m = 0 for i in range(len(s)): if i - m >= 1 and s[i-m-1:i+1] == s[i-m-1:i+1][::-1]: m += 2 elif i - m >= 0 and s[i-m:i+1] == s[i-m:i+1][::-1]: m += 1 if m != 0: print(m) except: break
从头到尾扫描字符串,每增加一个新的字符,判断以这个字符结尾,且长度为m+1或m+2的子串是否为回文,
如果是,更新最大回文子串 ---> 中心扩散
- i- m >= 1: 防止发生数组越界
- 长度为m+1或m+2的子串: s[i-m-1:i+1] || s[i-m:i+1]