最长公共子序列
题目:给定一个字符串s(1 <= s <= 1000),你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
通过这道题我们了解一下动态规划,并通过动态规划完成该题目!
解题思路:
提到回文串,利用回文串的特点,想到将源字符串逆序,“回文串”(不一定连续)相当于顺序没变
求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划很容易求得),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小编辑长度。
(1)把字符串旋转形成另外一个字符串,称为旋转字符串;
(2)求原字符串s1与旋转字符串s2中,最长公共子串的长度;
(3)删除的字符数目 = 原字符串的长度 - 最长公共子串的长度。
需要解决的子问题:
求两个字符串s1和s2中最长公共子串的长度。
子问题的求解方式:动态规划
设 MaxLen(i, j)表示s1左边i个字符与s2左边j个字符的最长公共子串长度,则子问题的解为MaxLen(strlen(s1), strlen(s2));
MaxLen(i, j)的求解方式为:
若s1第i个字符与s2第j个字符相匹配,则 MaxLen(i, j) = MaxLen(i - 1, j - 1)&#