九章算法官网-原文网址
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/
时间: 2024-10-29 04:41:17