题目描述

如果一个字符串S是由两个字符串T连接而成,即S = T + T, 我们就称S叫做平方串,例如"","aabaab","xxxx"都是平方串.

牛牛现在有一个字符串s,请你帮助牛牛从s中移除尽量少的字符,让剩下的字符串是一个平方串。换句话说,就是找出s的最长子序列并且这个子序列构成一个平方串。
输入描述:

输入一个字符串s,字符串长度length(1 ≤ length ≤ 50),字符串只包括小写字符。
输出描述:

输出一个正整数,即满足要求的平方串的长度。
示例1
输入

frankfurt
输出

4

解题思路

在不同位置将字符串切割成两个子串,然后采用动态规划的方式求解两个子串的公共子串大小。

完整代码

s = input()

def maxLen(a, b):
    len1 = len(a)
    len2 = len(b)
    dp = [[0 for j in range(len2 + 1)] for i in range(len1 + 1)]
    for i in range(1, len1 + 1):
        for j in range(1, len2 + 1):
            if a[i - 1] == b[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
    return dp[len1][len2] * 2

res = 0
for i in range(len(s) - 1):
    res = max(res, maxLen(s[0: i + 1], s[i+ 1: ]))
print(res)