题目
输入一个字符串,请问至少需要分割几次才可以使分割出的每个子字符串都是回文?例如,输入字符串"aaba",至少需要分割1次,从两个相邻字符’a’中间切一刀将字符串分割成两个回文子字符串"a"和"aba"。
分析
完成一件事需要多个步骤,而且每步可能面临多个选择,这个问题看起来需要用回溯法解决。但由于这个问题没有要求列出所有符合要求的分割方法,而是只需要计算出最少的分割次数,因此这个问题更适合用动态规划来解决。
如果子字符串S[0…i]本身就是一个回文,那么不需要分割就符合要求,此时f(i)等于0。如果子字符串S[0…i]不是一个回文,那么对每个下标j(1≤j≤i)逐一判断子字符串S[j…i]是不是回文。如果是回文,那么这就是一个有效的分割方法,此时的分割次数相当于子字符串S[0…j-1]的分割次数再加1,因为这是将子字符串S[0…j-1]按照要求分割之后再在S[j-1]和S[j]这两个字符中间再分割一次。因此,f(i)就是所有符合条件的j对应的f(j-1)的最小值加1。
对于字符串
"aabacd"
先算出
dp[1] --- "a"
dp[2] --- "aa"
dp[3] --- "aab"
随着字符串的增大,dp[n]的值不断增大
[0, 0, 1, 1, 2, 2, 2, 3, 4, 5, 6, 6, 6]
6
在判断的时候,先给出最差情况
dp[i] = i;// 每个字符分割一刀,表示最大值
然后判断string[j...i],是不是回文,是就dp[j-1]+1,
不是就 dp[j - 1] + i - j + 1
代码
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int result = minCut("aabacccfgaccc");
System.out.println(result);
}
public s

文章讲述了如何通过动态规划算法解决一个关于字符串分割的问题,即找到最少的分割次数,使得分割后的子串都是回文。通过计算`dp`数组,确定每个位置是否需要分割以及分割的最小次数,最后返回整个字符串需要的最少分割次数。
最低0.47元/天 解锁文章
906

被折叠的 条评论
为什么被折叠?



