您的位置:首页 > 职场人生

九章算法面试题48 分割回文串

2015-05-13 01:39 369 查看

九章算法官网-原文网址

http://www.jiuzhang.com/problem/48/

题目

对于给定字符串,求最少需要几次划分,能够将字符串划分为若干子串,每个子串都是一个回文串。如abaab,需要至少1次划分,将字符串划分为:a|baab,每个部分均为回文串。

解答

这是一道典型的在字符串上进行分割的动态规划的问题。一般的状态表示方法如下:f[i]表示将前i个字符组成的子串进行划分,能够最少划分为多少个串,每个串都是回文串。那么有状态转移方程:f[i] = MIN(f[j] + 1, j<i && j+1~i是一个回文串)。这里判断一个串是否为回文串,可以用O(n)的判断,整体复杂度为i * j * 判断回文串 = O(n^3)。但这个复杂度是可以进行进一步优化的。即并不需要每次去重新判断一个字符串是否为回文串。可以多耗费一点空间,如用isPalindrome[i][j]代表i到j是否为一个回文串。很显然这个数组是存在递推关系的,可以在O(n^2)的时间内解决。所以整体的时间复杂度可以降到O(n^2)


参考程序:

http://answer.ninechapter.com/solutions/palindrome-partitioning-ii/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: