您的位置:首页 > 其它

coderforces 335B--Palindrome [字符串好题]

2014-04-06 13:05 302 查看
给出一个字符串s(长度小于50000),从中找出一个长度不超过100但尽可能长的回文子串(这里的子串不一定要连续的),任意输出一个即可。

codeforces的题目都有标签,这题不例外有个DP,便一开始就往这方面想。首先回文一定要左右“对称”,那么如果做动态规划,那么必须左右同时进行。一开始想记f(i,j)为i到j这个区间的最长回文串,但就是空间就已经超了。看到题目中找的最长只是100,能不能记其他状态呢?

后来想以f(i,j)表示从i开始,一定要找出长度为j的回文串(没有则是-1),该回文串的右端最左是多少。比如有一个字符串是cbcbaa(下标从0开始)。从0开始长度为2的回文串有c-c---、-b-b--、----aa(横线是为了方便看见回文串在原字符串的位置),它们右端下标分别为2、3、5,最小的是2。所以f(0,2)等于2。

那么状态转移方程:


上面所说的查找可以用二分查找。时间复杂度为O(50000 * 100 * log2(50000) )。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: