求两字符串最长公共子序列LCS的应用—删除字符串的字符剩下回文串

来源:互联网 发布:淘宝客单页网站源码 编辑:程序博客网 时间:2024/05/16 03:23

转自:http://blog.csdn.net/yebanxin/article/details/52186706
问题描述:
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。
例如:输入:google 输出:2

思路:回文串通常可以用逆序的方式寻找思路。例如字符串google逆序后elgoog,字符串alibaba逆序后ababila,可以发现求回文串的问题可以转换成求两个字符串的最大公共子序列的问题(序列可以不连续)。
需要删除的长度 = 字符串的长度 - 字符串与逆序字符串的最大公共子序列的长度
问题描述:求两个字符串的最大公共子序列(LCS)(序列可以不连续)
例如:alibaba和ababila的最大公共子序列为ababa
思路:对于字符串a和字符串b,长度分别为m,n,先考虑他们的最后一个字符。
(1)如果相等,说明最后一个字符一定可以是最大公共子序列的最后一位(这里使用可以的意思是:有多解),那么我们可以先丢弃这最后一位,求解字符串a.substr(0, m-2)和b.substr(0, n-2)的最大公共子序列。a.substr(x,y)表示截取字符串a的x到y下标之间的部分
(2)如果不相等,则最大子序列一定在一下两者之间:a.substr(0, m-2) 和 b.substr(0, n-1)(丢弃a的最后一位)a.substr(0, m-1) 和 b.substr(0, n-2)(丢弃b的最后一位)

阅读全文
0 0
原创粉丝点击