【力扣系列题目】最后一块石头的重量 分割回文串 验证回文串 等差数列划分{最大堆 背包 动态规划}

文章目录

  • 七、最后一块石头的重量
    • 最后一块石头的重量【堆】
    • [最后一块石头的重量 II](https://leetcode.cn/problems/last-stone-weight-ii/)【背包】
  • 八、分割回文串
    • 分割回文串【分割子串方案数量】
    • [分割回文串 II](https://leetcode.cn/problems/omKAoA/)【最少分割次数】
    • [分割回文串 III](https://leetcode.cn/problems/palindrome-partitioning-iii/)【分割成k个+可修改】
    • [分割回文串 IV](https://leetcode.cn/problems/palindrome-partitioning-iv/)【是否能发成三个】
  • 九、验证回文串
    • 验证回文串
    • [验证回文串 II](https://leetcode.cn/problems/RQku0D/)【最多删除一个】
    • [验证回文串 III](https://leetcode.cn/problems/valid-palindrome-iii/)【可删除k个】
    • [验证回文串 IV](https://leetcode.cn/problems/valid-palindrome-iv/)【可删除一或两个】
  • 十、等差数列划分
    • 前言
    • 等差数列划分【等差数组的子数组个数】
    • [等差数列划分 II - 子序列](https://leetcode.cn/problems/arithmetic-slices-ii-subsequence/)
  • 十一、demo

在这里插入图片描述

七、最后一块石头的重量

最后一块石头的重量【堆】

class Solution {
public:int lastStoneWeight(vector<int>& stones) {priority_queue<int> q;for (int s : stones) {q.push(s);}while (q.size() > 1) {int a = q.top();q.pop();int b = q.top();q.pop();if (a > b) {q.push(a - b);}}return q.empty() ? 0 : q.top();}
};

最后一块石头的重量 II【背包】

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {int sum = 0;for (auto x : stones)sum += x;int n = stones.size(), m = sum / 2;vector<vector<int>> dp(n + 1, vector<int>(m + 1));for (int i = 1; i <= n; i++) {for (int j = 0; j <= m; j++) {dp[i][j] = dp[i - 1][j];if (j >= stones[i - 1])dp[i][j] = max(dp[i][j], dp[i - 1][j - stones[i - 1]] +stones[i - 1]);}}return sum - 2 * dp[n][m];}
};

八、分割回文串

分割回文串【分割子串方案数量】

class Solution {
private:vector<vector<int>> f;vector<vector<string>> ans;vector<string> path;int n;void dfs(const string& s, int i) {if (i == n) {ans.push_back(path);return;}for (int j = i; j < n; ++j) {if (isPalindrome(s, i, j) == 1) {path.push_back(s.substr(i, j - i + 1));dfs(s, j + 1);path.pop_back();}}}// 0未搜索 1回文串 -1不是回文串int isPalindrome(const string& s, int i, int j) {if (f[i][j] != 0)return f[i][j];if (i > j || i == j || (i + 1 == j && s[i] == s[j]))return f[i][j] = 1;f[i][j] = (s[i] == s[j] ? isPalindrome(s, i + 1, j - 1) : -1);return f[i][j];}public:vector<vector<string>> partition(string s) {n = s.size();f.assign(n, vector<int>(n));dfs(s, 0);return ans;}
};

分割回文串 II【最少分割次数】

class Solution
{void init(const string &s, vector<vector<bool>> &isPal){int n = s.size();for (int i = n - 1; i >= 0; i--){for (int j = i; j < n; j++){if (i == j || (i + 1 == j && s[i] == s[j]))isPal[i][j] = true;else if (s[i] == s[j])isPal[i][j] = isPal[i + 1][j - 1];}}}public:int minCut(string s){int n = s.size();vector<vector<bool>> isPal(n, vector<bool>(n,false));init(s, isPal);vector<int> dp(n, INT_MAX);for (int i = 0; i < n; i++){if (isPal[0][i])dp[i] = 0;else{ for (int j = 1; j <= i; j++)if (isPal[j][i])dp[i] = min(dp[i], dp[j - 1] + 1);}}return dp[n - 1];}
};

分割回文串 III【分割成k个+可修改】

class Solution {int cost2(string& s, int l, int r) {int ret = 0;for (int i = l, j = r; i < j; ++i, --j) {if (s[i] != s[j])++ret;}return ret;}void init(string& s, vector<vector<int>>& cost) {int n = s.size();// span:区间长度; i:区间起点; j:区间终点for (int span = 2; span <= n; ++span) {for (int i = 0; i <= n - span; ++i) {int j = i + span - 1;cost[i][j] = cost[i + 1][j - 1] + (s[i] == s[j] ? 0 : 1);}}}public:int palindromePartition(string& s, int k) {int n = s.size();vector<vector<int>> cost(n, vector<int>(n));init(s, cost);vector<vector<int>> f(n + 1, vector<int>(k + 1, INT_MAX));f[0][0] = 0;for (int i = 1; i <= n; ++i) {for (int j = 1; j <= min(k, i); ++j) {if (j == 1)// f[i][j] = cost(s, 0, i - 1);f[i][j] = cost[0][i - 1];else {for (int i0 = j - 1; i0 < i; ++i0) {f[i][j] =// min(f[i][j], f[i0][j - 1] + cost(s, i0, i - 1));min(f[i][j], f[i0][j - 1] + cost[i0][i - 1]);}}}}return f[n][k];}
};

分割回文串 IV【是否能发成三个】

class Solution {void init(const string& s, vector<vector<bool>>& isPal) {int n = s.size();for (int i = n - 1; i >= 0; i--) {for (int j = i; j < n; j++) {if (i == j || (i + 1 == j && s[i] == s[j]))isPal[i][j] = true;else if (s[i] == s[j])isPal[i][j] = isPal[i + 1][j - 1];}}}public:bool checkPartitioning(string s) {int n = s.size();vector<vector<bool>> dp(n, vector<bool>(n));init(s, dp);for (int i = 1; i < n - 1; i++)for (int j = i; j < n - 1; j++)if (dp[0][i - 1] && dp[i][j] && dp[j + 1][n - 1])return true;return false;}
};

九、验证回文串

验证回文串

class Solution {
public:bool isPalindrome(string s) {int n = s.size();int left = 0, right = n - 1;while (left < right) {while (left < right && !isalnum(s[left]))++left;while (left < right && !isalnum(s[right]))--right;if (left < right) {if (tolower(s[left]) != tolower(s[right]))return false;++left;--right;}}return true;}
};

验证回文串 II【最多删除一个】

class Solution {
public:bool checkPalindrome(const string& s, int low, int high) {int i = low, j = high;while (i < j) {if (s[i] != s[j])return false;++i;--j;}return true;}bool validPalindrome(string s) {int low = 0, high = s.size() - 1;while (low < high) {char c1 = s[low], c2 = s[high];if (c1 == c2) {++low;--high;} else {return checkPalindrome(s, low, high - 1) ||checkPalindrome(s, low + 1, high);}}return true;}
};

验证回文串 III【可删除k个】

class Solution {bool fun(string& s, int k) {int n = s.size();vector<vector<int>> f(n, vector<int>(n));for (int i = n - 1; i >= 0; i--) {for (int j = i + 1; j < n; j++) {if (i == j || (i + 1 == j && s[i] == s[j]))f[i][j] = 0;if (i + 1 == j && s[i] != s[j])f[i][j] = 1;if (s[i] == s[j])f[i][j] = f[i + 1][j - 1];elsef[i][j] = min(f[i][j - 1], f[i + 1][j]) + 1;}}return f[0][n - 1] <= k;}public:vector<vector<int>> memo;int dfs(string& s, int i, int j) {if (i == j)return 0;if (i + 1 == j)return s[i] == s[j] ? 0 : 1;if (memo[i][j] != -1)return memo[i][j];if (s[i] == s[j])return memo[i][j] = dfs(s, i + 1, j - 1);return memo[i][j] = 1 + min(dfs(s, i + 1, j), dfs(s, i, j - 1));}bool isValidPalindrome(string s, int k) {return fun(s, k);memo.resize(s.length(), vector<int>(s.length(), -1));return dfs(s, 0, s.length() - 1) <= k;}
};

验证回文串 IV【可删除一或两个】

class Solution {
public:bool makePalindrome(string s) {int need = 0;int l = 0, r = s.size() - 1;while (l < r) {if (s[l] != s[r]) need++;l++;r--;}return need <= 2;}
};

十、等差数列划分

前言

先看这道题

最长等差数列

按照固定i j后两位 然后找k的存在的思想在本题中无法解决。因为该题的测试用例中,a可能存在多个,题目需要“最长”, 当i前有多个a时,我们需要的是最近的a,所以初始化index数组时,不能将所有元素提前处理好,map中的键是唯一的,故,后来的a会覆盖之前的a,也就无法在枚举i时,特定的去i前找。

错误解法示例

class Solution
{
public:int longestArithSeqLength(vector<int> &arr){unordered_map<int, int> indices;int n = arr.size();for (int i = 0; i < n; i++)indices[arr[i]] = i;vector<vector<int>> dp(n, vector<int>(n,2));int ans = 2;for (int i = 2; i < n; i++){for (int j = i - 1; j >= 0; j--){// a b c  a=b-(c-b)=2b-c// k j iint k = -1;int x = 2 * arr[j] - arr[i];if (indices.count(x))k = indices[x];if (0 <= k && k < j)dp[j][i] = dp[k][j] + 1;ans = max(ans, dp[j][i]);}}return ans;}
};

非得按照之前的思路

class Solution {
public:int longestArithSeqLength(vector<int>& arr) {int n = arr.size();unordered_map<int, vector<int>> hash;for (int i = 0; i < n; i++)hash[arr[i]].push_back(i);vector<vector<int>> dp(n, vector<int>(n, 2));int ans = 2;// a b c  a=b-(c-b)=2b-c// k j ifor (int i = 2; i < n; i++) {for (int j = i - 1; j >= 0; j--) {int k = -1;int x = 2 * arr[j] - arr[i];if (hash.count(x)) {for (int k : hash[x]) {if (0 <= k && k < j)dp[j][i] = dp[k][j] + 1;}}ans = max(ans, dp[j][i]);}}return ans;}
};
class Solution
{
public:int longestArithSeqLength(vector<int> &nums){unordered_map<int, int> hash;hash[nums[0]] = 0;int n = nums.size();vector<vector<int>> dp(n, vector<int>(n, 2));int ret = 2;// a b c  a=b-(c-b)=2b-c// k j ifor (int j = 1; j < n; j++){for (int i = j + 1; i < n; i++){int a = 2 * nums[j] - nums[i];if (hash.count(a))dp[j][i] = dp[hash[a]][j] + 1;ret = max(ret, dp[j][i]);}hash[nums[j]] = j;}return ret;}
};

等差数列划分【等差数组的子数组个数】

class Solution {// a b c// a b c d && b c d
public:int numberOfArithmeticSlices(vector<int>& nums) {// dp[i] 表⽰必须「以 i 位置的元素为结尾」的等差数列有多少种。int n = nums.size();vector<int> dp(n);int sum = 0;for (int i = 2; i < n; i++) {dp[i] = nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]? dp[i - 1] + 1: 0;sum += dp[i];}return sum;}
};

等差数列划分 II - 子序列

class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n = nums.size();unordered_map<long long, vector<int>> hash;for (int i = 0; i < n; i++)hash[nums[i]].push_back(i);vector<vector<int>> dp(n, vector<int>(n));int sum = 0;for (int j = 2; j < n; j++){for (int i = 1; i < j; i++) {long long a = (long long)nums[i] * 2 - nums[j];if (hash.count(a))for (auto k : hash[a])if (k < i)dp[i][j] += dp[k][i] + 1;elsebreak;sum += dp[i][j];}}return sum;}
};

十一、demo

最短回文串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go gin配置air

一、依赖下载 安装最新&#xff0c;且在你工作区下进行安装&#xff0c;我的是D:/GO是我的工作区&#xff0c;所有项目都在目录下的src&#xff0c; go install github.com/air-verse/airlatest 如果出现类似报错&#xff1a; 将图中第三行 github.com/air-verse/air 替换最…

读书笔记--分布式服务架构对比及优势

本篇是在上一篇的基础上&#xff0c;主要对共享服务平台建设所依赖的分布式服务架构进行学习&#xff0c;主要记录和思考如下&#xff0c;供大家学习参考。随着企业各业务数字化转型工作的推进&#xff0c;之前在传统的单一系统&#xff08;或单体应用&#xff09;模式中&#…

openRv1126 AI算法部署实战之——ONNX模型部署实战

在RV1126开发板上部署ONNX算法&#xff0c;实时目标检测RTSP传输。视频演示地址 rv1126 yolov5 实时目标检测 rtsp传输_哔哩哔哩_bilibili 一、准备工作 1.从官网下载YOLOv5-v7.0工程&#xff08;YOLOv5的第7个版本&#xff09; 手动在线下载&#xff1a; Releases ultraly…

【C++题解】1055. 求满足条件的整数个数

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1055. 求满足条件的整数个数 类型&#xff1a;简单循环 题目描述&#xff1a; 在 1∼n 中&#xff0c;找出能同时满足用 3 除余 2 &#xff0c;用 5 除余 3 &#xff0c;用 7 除余…

亚博microros小车-原生ubuntu支持系列:17 gmapping

前置依赖 先看下亚博官网的介绍 Gmapping简介 gmapping只适用于单帧二维激光点数小于1440的点&#xff0c;如果单帧激光点数大于1440&#xff0c;那么就会出【[mapping-4] process has died】 这样的问题。 Gmapping是基于滤波SLAM框架的常用开源SLAM算法。 Gmapping基于RBp…

R语言统计分析——ggplot2绘图4——刻面

参考资料&#xff1a;R语言实战【第2版】 如果组在途中并排出现而不是重叠为单一的图形&#xff0c;关系就是清晰的。我们可以使用facet_wrap()函数和facet_grid()函数创建网格图形&#xff08;在ggplot2中也称刻面图&#xff09;&#xff0c;相关语法如下&#xff1a; 语法结…

AI大模型开发原理篇-9:GPT模型的概念和基本结构

基本概念 生成式预训练模型 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型 是由 OpenAI 开发的基于 Transformer 架构的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;专门用于文本生成任务。它的设计理念在于通过大规模的预训练来学习语言模…

使用Edu邮箱申请一年免费的.me域名

所需材料&#xff1a;公立Edu教育邮箱一枚&#xff08;P.S&#xff1a;该服务不支持所有的Edu教育邮箱&#xff0c;仅支持比较知名的院校&#xff09; 说到域名&#xff0c;.me这个后缀可谓是个性十足&#xff0c;适合个人网站、博客等。.me是黑山的国家顶级域名&#xff08;c…

【RocketMQ 存储】- RocketMQ存储类 MappedFile

文章目录 1. 前言2. ReferenceResource3. MappedFile3.1 核心参数3.2 构造器3.3 消息追加3.4 消息刷盘3.5 消息提交3.6 截取一段 ByteBuffer3.7 cleanup 释放堆外内存3.8 destroy 销毁 mappedFile3.9 warmMappedFile 4. 小结 本文章基于 RocketMQ 4.9.3 1. 前言 上一篇文章中我…

Autosar-Os是怎么运行的?(时间保护)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 1.功能概述 AUTOSAR OS 的四大可定制类型凸显了时间保护&#xff08;Timing Protection&#xff09;…

Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)

目录 什么是软件包 Linux 软件包管理器 apt 认识apt 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式下各指令汇总 vim底行模式个指令汇总 Linux编译器 - gcc/g gcc/g的作…

计算机网络 (62)移动通信的展望

一、技术发展趋势 6G技术的崛起 内生智能&#xff1a;6G将强调自适应网络架构&#xff0c;通过AI驱动的智能算法提升通信能力。例如&#xff0c;基于生成式AI的6G内生智能架构将成为重要研究方向&#xff0c;实现低延迟、高效率的智能通信。信息编码与调制技术&#xff1a;新型…

【卫星通信】链路预算方法

本文介绍卫星通信中的链路预算方法&#xff0c;应该也适用于地面通信场景。 更多内容请关注gzh【通信Online】 文章目录 下行链路预算卫星侧参数信道参数用户侧参数 上行链路预算链路预算计算示例 下行链路预算 卫星侧参数 令卫星侧天线数为 M t M_t Mt​&#xff0c;每根天线…

详细解释java当中的所有知识点(前言及数据类型及变量)(第一部分)

会将java当中的所有的知识点以及相关的题目进行分享&#xff0c;这是其中的第一部分&#xff0c;用红色字体标注出重点&#xff0c;以及加粗的方式进行提醒 目录 一、Java语言概述 1.Java语言简介 2.语言优势 二、main方法 1.Java程序结构组成 2.运行Java程序 3.注释 4.…

MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询

介绍 在开发商品模块时&#xff0c;通常使用分表的方式进行查询以及关联。在通过表连接的方式进行查询。每个商品都有不同的分类&#xff0c;每个不同分类下面都有商品规格可以选择&#xff0c;每个商品分类对应商品规格都有自己的价格和库存。在实际的开发中应该给这些表进行…

【竞技宝】LOL:两大赛区胜率达到78.6!

北京时间1月29日&#xff0c;英雄联盟2025新赛季正在如火如荼的进行之中&#xff0c;目前由于新春佳节的到来&#xff0c;LCK和LPL赛区都进行了短暂的休赛期。在新春佳节之前的比赛中&#xff0c;由于新版本以及全局BP&#xff08;LPL&#xff09;的到来&#xff0c;很多英雄都…

软件测试 —— jmeter(2)

软件测试 —— jmeter&#xff08;2&#xff09; HTTP默认请求头&#xff08;元件&#xff09;元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组&#xff08;Stepping Thread Group&#xff09;参数解析总结 Response Times over TimeActive Thre…

信息安全专业优秀毕业设计选题汇总:热点选题

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

在线课堂小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

vim如何解决‘’文件非法关闭后,遗留交换文件‘’的问题

过程描述&#xff1a; 由于我修改文件时&#xff08;一定得修改了文件&#xff0c;不做任何修改不会产生这个问题&#xff09;的非法关闭&#xff0c;比如直接关闭虚拟机&#xff0c;或者直接断开远程工具的远程连接&#xff0c;产生了以下遗留交换文件的问题&#xff1a; 点击…