截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666





371,背包问题系列之-基础背包问题



//字符串的子串[left,right]变成回文串所需要修改的字符数
private int change(String s, int left, int right) {int count = 0;while (left < right) {//如果两个指针指向的字符相同,我们不需要修改。//如果不相同,只需要修改其中的一个即可,所以// 修改数要加1if (s.charAt(left++) != s.charAt(right--))count++;}return count;
}

分析到这里,这题的代码基本上就呼之欲出了,我们来看下完整代码

public int palindromePartition(String s, int k) {int length = s.length();//dp[i][j]表示s的前i个字符分割成k个子串所修改的最少字符数。int[][] dp = new int[length + 1][k + 1];//因为这题要求的是所需要修改的最少字符数,初始值我们赋值尽可能大for (int i = 0; i < dp.length; i++) {Arrays.fill(dp[i], length);}//前i个字符,分割成j个回文子串for (int i = 1; i <= length; i++) {//前i个字符最大只能分割成i个子串,所以不能超过i,//我们取i和k的最小值int len = Math.min(i, k);for (int j = 1; j <= len; j++) {if (j == 1) {//如果j等于1,则表示没有分割,我们直接计算dp[i][j] = change(s, j - 1, i - 1);} else {//如果j不等于1,我们计算分割所需要修改的最小字符数,因为m的值要//大于等于j-1,我们就从最小的开始枚举for (int m = j - 1; m < i; m++) {//递推公式dp[i][j] = Math.min(dp[i][j], dp[m][j - 1] + change(s, m, i - 1));}}}}//返回前length个字符分割成k个子串所需要修改的最少字符数return dp[length][k];
}//字符串的子串[left,right]变成回文串所需要修改的字符数
private int change(String s, int left, int right) {int count = 0;while (left < right) {//如果两个指针指向的字符相同,我们不需要修改。//如果不相同,只需要修改其中的一个即可,所以// 修改数要加1if (s.charAt(left++) != s.charAt(right--))count++;}return count;
}

public int palindromePartition(String s, int k) {int length = s.length();//palindrome[i][j]表示子串[i,j]转化为回文串所需要的修改的字符数int[][] palindrome = new int[length][length];//2种实现方式//        //一列一列的从左往右(只遍历右上部分)//        for (int j = 1; j < length; j++) {//            for (int i = 0; i < j; i++) {//                palindrome[i][j] = palindrome[i + 1][j - 1] + (s.charAt(i) == s.charAt(j) ? 0 : 1);//            }//        }//一行一行的从下往上(只遍历右上部分)for (int i = length - 2; i >= 0; i--) {for (int j = i + 1; j < length; j++) {palindrome[i][j] = palindrome[i + 1][j - 1] + (s.charAt(i) == s.charAt(j) ? 0 : 1);}}//dp[i][j]表示s的前i个字符分割成k个回文子串的最少次数,//第一行和第一列应该都是0。int[][] dp = new int[length + 1][k + 1];for (int i = 1; i < dp.length; i++) {Arrays.fill(dp[i], Integer.MAX_VALUE);}//前i个字符,分割成j个回文子串for (int i = 1; i <= length; i++) {int len = Math.min(i, k);for (int j = 1; j <= len; j++) {if (j == 1)//字符串的下标是从0开始的,所以这里要减1dp[i][j] = palindrome[j - 1][i - 1];elsefor (int m = j - 1; m < i; m++) {dp[i][j] = Math.min(dp[i][j], dp[m][j - 1] + palindrome[m][i - 1]);}}}return dp[length][k];
}

因为dp[i][j]中i必须大于等于j,所以这里遍历的时候可以有两种方式,如下图所示

总结

LeetCode上分隔回文串总共有4题,其中只有一道中等,其他3道都是困难,这里把这4道都讲完了,也可以一起看下前面的3道题。

551,回溯算法解分割回文串

553,动态规划解分割回文串 II

570,动态规划解回文串分割 IV

LeetCode 1278. 分割回文串 III相关推荐

  1. LeetCode 1278. 分割回文串 III(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个由小写字母组成的字符串 s,和一个整数 k. 请你按下面的要求分割字符串: 首先,你可以将 s 中的部分字符修改为其他的小写英文字母. 接着,你需 ...

  2. LeetCode 131. 分割回文串【字符串,回溯算法】

    131. 分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = &q ...

  3. LeetCode 132. 分割回文串 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: ...

  4. LeetCode 131. 分割回文串(回溯)

    文章目录 1. 题目 2. 回溯 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: ...

  5. leetcode 131. 分割回文串 思考分析

    题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 思考 问题可以分为两个子问题:1.判断回文串2.分割数组 判断回文串 bool isPalin ...

  6. leetcode 131. 分割回文串(dp+回溯)

    给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = "aab&quo ...

  7. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]

    题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...

  8. leetcode:491. 递增子序列、17. 电话号码的字母组合、31. 分割回文串、93. 复原 IP 地址(JavaScript)

    文章目录 491. 递增子序列 分析 去重 如何保证递增呢? 17. 电话号码的字母组合 思路: 单层递归逻辑 递归终止条件 完整代码 另一种写法 31. 分割回文串 思路:分析题目本题可分为两步 9 ...

  9. 怎么判断一个字符串的最长回文子串是否在头尾_LeetCode 第 131 号问题:分割回文串...

    题目来源于 LeetCode 上第 131 号问题:分割回文串.题目难度为 Medium,目前通过率为 45.8% . 题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返 ...

最新文章

  1. android中xml文件的生成与读取(Pull)
  2. 编译Bitcoin BCH configure: error: libdb_cxx headers missing ,终于解决了
  3. Spring AOP源码分析(七)ProxyFactoryBean介绍
  4. 服务器flask远程访问_在Flask中使用什么API来检查远程(其他)服务器的连接?...
  5. 连接moogDB数据库
  6. UNIX网络编程——fcntl函数
  7. python社招面试_百度大牛总结十条Python面试题陷阱,看看你是否会中招
  8. 12019.LMT84模拟温度传感器
  9. 在线闹钟html代码复制,html5时钟实现代码
  10. 自动化测试pytest测试框架实例
  11. php验证码完整功能,用PHP实现验证码功能
  12. 计算不确定度的小工具
  13. 【408考研计划】计算机组成原理
  14. 关于被隐藏的文件夹无法去掉隐藏的属性
  15. 一生要知道的100幅世界名画
  16. C22-利用泰勒公式求sin(x)的值
  17. 领域模型 PO、VO、DAO、BO、DTO、POJO
  18. MVC 音乐商店 第 10 部分: 导航和网站设计、 结论的最后更新
  19. 海伦公式的计算机表达,海伦公式之算法与程序框图
  20. 微信 libco 协程库原理剖析

热门文章

  1. (1) DPDK 简介
  2. window10下运行激活软件时会提示病毒文件,并且自动删除问题
  3. ReviewBoard安装配置
  4. Win系统蓝牙设备删除失败 - 解决方案
  5. MooTools and Sizzle
  6. Linux学习(一)-- df/du命令
  7. Bezier曲线、B样条和NURBS的基本概念
  8. 微信小程序实现简单的瀑布流式布局
  9. 马尔科夫链预测,Python实现
  10. python、pip安装