给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述: 对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子1:
abcda
google
输出例子1:
2
2
回文串的特点是,逆序输出和正序输出是一样的。所以这道题可以从这方面来考虑。如果将此字符串逆序输出,那么两个字符串的最长公共子序列将是最长的回文字符串,那么剩余的值将是要删除的字符个数。
注意1:输入有可能最后存在空格,所以要用strip()移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
注意2:循环输入多个样例。一定要用try except才能a过去!因为有可能输入为空。
while True:
try:
s = list(input().strip())
s_r = s[::-1]
# dp[i][j]代表的是A数组前i个数(不包括i)和B数组前j个数(不包括j)的最长公共子序列
dp = [[0] * (len(s)+1) for i in range(len(s_r)+1)]
res = 0
for i in range(1, len(s)+1):
for j in range(1, len(s_r)+1):
if s[i-1] == s_r[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i][j-1], dp[i-1][j])
res = dp[len(s)][len(s)]
print(len(s)-res)
except:
break