HJ32 密码截取
解析:这道题很明显是求回文子串的问题,跟之前leetcode上面的求回文子串个数很像。用dp[i][j]
数组表示索引从i~j
的位置能否形成回文子串,i,j
的推导需要从i + 1,j - 1
处推得,故i
从后遍历,j
从前遍历。如果是s[i] != s[j]
,则不可能形成回文子串。如果s[i] == s[j]
,且i和j相等(一个元素)或者i和j相邻,中间无元素,是回文子串,长度为2。如果中间还有其他元素,则判断中间元素是否是回文子串。
# python
a = input()
dp = [[False] * len(a) for _ in range(len(a))]
res = 1
for i in range(len(a) - 1, -1, -1):
for j in range(i, len(a)):
if a[i] == a[j]:
if j - i <= 1:
res = max(res, j - i + 1)
dp[i][j] = True
elif dp[i + 1][j - 1]:
res = max(res, j - i + 1)
dp[i][j] = True
print(res)