【C++ 算法进阶】算法提升十一 十二

目录标题

  • 让字符串成为回文串的最少插入次数
    • 题目
    • 题目分析
    • 代码
    • 题目
    • 题目
  • 字符子串 (滑动窗口)
    • 题目
    • 题目分析
    • 代码
  • 最长连续子序列 (头尾表)
    • 题目
    • 题目分析
    • 代码

让字符串成为回文串的最少插入次数

题目

本题为为LC原题 题目如下

在这里插入图片描述

题目分析

这是一道范围尝试模型的动态规划

我们规定dp[i][j]的含义是 让字符串i到j位置成为回文串的最少插入次数

那么假设我们现在要求dp[i][j]的数值我们需要知道什么信息呢?

  1. dp[i + 1][j]

知道了该位置的插入次数之后我们只需要在前面再插入一个字符就能形成回文字符串了

  1. dp[i][j-1]

同理

  1. dp[i+1][j-1]

只有当字符串的i j位置相同的时候我们可以使用这一项 dp[i][j] = dp[i+1][j-1]

代码

class Solution {
public:int minInsertions(string s) {if (s.size() == 1) {return 0;}vector<vector<int>> dp(s.size() , vector<int>(s.size() , 0));int i = 0;while (i < s.size() - 1) {if (s[i] == s[i+1]) {dp[i][i+1] = 0;} else {dp[i][i+1] = 1;}i++;}for (i = s.size() - 3 ; i >=0 ; i--) {for (int j = i + 2; j < s.size(); j++) {if (s[i] == s[j]) {dp[i][j] = dp[i+1][j-1];}else {int p1 = dp[i+1][j] + 1;int p2 = dp[i][j-1] + 1;dp[i][j] = min(p1 , p2);}}}return dp[0][s.size() - 1];}
};

题目

列举出一种拼接的可能性 (返回一个字符串)

我们在获得dp表之后 只需要从右上角的位置开始依次递推 就能得出最终的答案

题目

列举出所有拼接的可能性 (返回所有可能的字符串)

我们在获得dp表之后 只需要从右上角位置开始依次递推所有的可能性 就能得出最终的答案 (递归)

字符子串 (滑动窗口)

题目

现在给定一个字符串 str 给定一个目标字符串 aim 现在请问 是否在str字符串中有一个连续的子串m和目标字符串(字符的顺序无所谓)

如果有则返回这个连续子串的初始位置 (如果有多个 则返回第一个即可)

如果没有则返回-1

题目分析

本题是一个很明显的滑动窗口问题 (aim的长度是固定的 在字符串str上从左到右移动)

现在的问题是 我们有没有办法优化该窗口查找的时间复杂度

一般的方法是 我们每形成一个滑动窗口 就让该窗口的字符和aim字符串里面的字符进行比较

那么有没有一种更好的方式呢?

带有这种字符数目的题目 我们就要联想到哈希表

我们可以在哈希表中 统计aim每个字符的个数 在第一次形成窗口的时候让这些字符的个数减去窗口中字符的个数 (可以小于0)

之后我们遍历哈希表 查看是否所有的value都为0即可

代码

int process(string& s1, string& aim) {unordered_map<char, int> map1;for (auto x : aim) {map1[x]++;}int L = 0;int R = aim.size() - 1;for (int i = L; i <= R; i++) {if (map1.count(s1[i]) == 1){map1[s1[i]]--;}}for (int i = R + 1; i < s1.size(); i++){int r = 0;for (auto x : map1) {if (x.second != 0) {r = 1;}}if (r == 0) {return i - aim.size();}if (map1.count(s1[L]) == 1){map1[s1[L]]++;}L++;R++;if (map1.count(s1[R]) == 1){map1[s1[R]]--;}}int r = 0;for (auto x : map1) {if (x.second != 0) {r = 1;}}if (r == 0) {return s1.size() - aim.size();}
}

最长连续子序列 (头尾表)

题目

本题为LC原题 题目如下

在这里插入图片描述

题目分析

本题其实和 C++ 算法提升二 中的信息流问题解法一样 还要更简单一点

我们要打印的是一个连续的区间 所以说等数据到了之后让其跟我们现在需要的数据对比的方式肯定不可行

那我们想想看 怎么才能让一段数据连续呢? ---- 单链表

我们可以使用单链表来表示一串连续的数据 但是这里也会出现一个问题

我们怎么保证接收到的数据正好让这一串单链表连接起来呢?

这里提供一种思路

我们创建两章哈希表 头表和尾表

头表 存储一串连续的单链表的头部
尾表 存储一串连续的单链表的尾部

图中的数字代表一个节点

图中的每个数字都代表一个节点 后面其实都有一个指针指向空

假如说现在加入一个四号节点

在这里插入图片描述

那么图片就会变成上面这样
在这里插入图片描述

但是由于3 4 5本身就是一串连续的字节流 所以说头表尾表就会变成下面的形式

在这里插入图片描述

头表中只剩下一个3 尾表中只剩下一个5

假设我们现在想要的第一个数字是2 那么当2来到之后只需要和3 头尾相连 我们打印整个单链表就能得到我们想要的结果了 (当然我们要记得处理下头尾表数据)

代码

struct Node {int _num;Node* next; // next指针Node(int x) {_num = x;next = nullptr;}
};class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_map<int, Node*> head;unordered_map<int, Node*> tail;unordered_map<int, int> count11;for (auto x : nums) {if (count11.count(x) == 0) {auto* n1 = new Node(x);head[x] = n1;tail[x] = n1;// 查看x是否是某个链表的尾巴if (tail.count(x - 1) == 1) {tail[x - 1]->next = n1;head.erase(x);tail.erase(x - 1);}// 查看x是否是某个链表的头if (head.count(x + 1) == 1) {n1->next = head[x + 1];tail.erase(x);head.erase(x + 1);}count11[x] = 1;}}int ans = 0;for (auto& x : head) {auto cur = x.second;int count = 0;while (cur) {cur = cur->next;count++;}ans = max(ans, count);}return ans;}
};

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

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

相关文章

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

域名邮箱推荐:安全与稳定的邮件域名邮箱!

域名邮箱推荐及绑定攻略&#xff1f;最好用的域名邮箱服务推荐&#xff1f; 域名邮箱&#xff0c;作为一种个性化且专业的电子邮件服务&#xff0c;越来越受到企业和个人的青睐。烽火将详细介绍域名邮箱登录的全过程&#xff0c;从注册到登录&#xff0c;帮助您轻松掌握这一重…

AI教育革命:个性化学习的新篇章

内容概要 在 教育 领域&#xff0c;人工智能 的崭露头角带来了前所未有的变化。如今&#xff0c;个性化学习 已不再是一个遥不可及的梦想&#xff0c;而是通过 AI 技术真正实现的可能。借助先进的数据分析能力&#xff0c;教师可以实时跟踪和评估每位学生的学习进度&#xff0…

[2024最新] macOS 发起 Bilibili 直播(不使用 OBS)

文章目录 1、B站账号 主播认证2、开启直播3、直播设置添加素材、隐私设置指定窗口添加/删除 窗口 4、其它说明官方直播帮助中心直播工具教程 目前搜到的 macOS 直播教程都比较古早&#xff0c;大部分都使用 OBS&#xff0c;一番探索下来&#xff0c;发现目前已经不需要 OBS了&a…

刷题---轮转数组

本题来自力扣刷题&#xff1a;轮转数组 首先我们来看一下题目描述 解题思路&#xff1a;首先创建一个新的数组&#xff0c;将后面k个数据数据放到新数组前面&#xff0c;将size-1个数据放在剩下的空间中&#xff0c;再把新数组的数据赋值给nums。看下图更好理解 代码展示 vo…

默认 iOS 设置使已锁定的 iPhone 容易受到攻击

苹果威胁研究的八个要点 苹果手机间谍软件问题日益严重 了解 Apple 苹果的设备和服务器基础模型发布 尽管人们普遍认为锁定的 iPhone 是安全的&#xff0c;但 iOS 中的默认设置可能会让用户面临严重的隐私和安全风险。 安全研究员 Lambros 通过Pen Test Partners透露&#…

常用的c++特性-->day02

c11新特性 可调用对象案例分析 可调用对象包装器语法案例可调用对象包装器作为函数参数补充&#xff1a;类型转换运算符案例 可调用对象绑定器语法格式绑定非类成员函数/变量案例1案例2案例3案例4 绑定类成员函数/变量 lambda表达式捕获列表案例1返回值案例2 --> 包装器绑定…

Linux进程信号(信号的产生)

目录 什么是信号&#xff1f; 信号的产生 信号产生方式1&#xff1a;键盘 前台进程 后台进程 查看信号 signal系统调用 案例 理解进程记录信号 软件层面 硬件层面 信号产生方式2:指令 信号产生方式3:系统调用 kill系统调用 案例 其他产生信号的函数调用 1.rais…

国产化浪潮下,高科技企业如何选择合适的国产ftp软件方案?

高科技企业在数字化转型和创新发展中&#xff0c;数据资产扮演着越来越重要的角色。在研发过程中产生的实验数据、设计文档、测试结果等&#xff0c;专利、商标、版权之类的创新成果等&#xff0c;随着信息量急剧增加和安全威胁的复杂化&#xff0c;传统的FTP软件已经不能满足这…

如何对接正规的外卖霸王餐接口?

根据搜索结果&#xff0c;合规地对接外卖霸王餐接口需要遵循以下步骤和注意事项&#xff1a; 1.合法性与合规性&#xff1a; 确保业务和对API的使用符合当地法律法规&#xff0c;包括消费者权益保护法、电子商务法等。了解并遵守与食品相关的法律法规&#xff0c;如食品安全法…

VUE3实现好看的通用网站源码模板

文章目录 1.设计来源1.1 网站主界面1.2 登录界面1.3 注册界面1.4 图文列表模板界面1.5 简洁列表模板界面1.6 文章内容左右侧模板界面1.7 文章内容模板界面 2.效果和源码2.1 动态效果2.2 源代码2.3 目录结构 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff…

论文阅读:DualDn Dual-domain Denoising via Differentiable ISP

这篇文章是 2024 ECCV 的一篇文章&#xff0c;介绍的是降噪相关的工作。 Abstract 图像去噪是相机图像信号处理 (ISP) 流程中的一个关键组成部分。将去噪器融入 ISP 流程有两种典型方式&#xff1a;直接对拍摄的原始帧&#xff08;RAW域&#xff09;应用去噪器&#xff0c;或…

从文本到图像:AIGC 如何改变内容生产的未来

从文本到图像&#xff1a;AIGC 如何改变内容生产的未来 在过去的几年里&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术迅速崛起&#xff0c;从基础的文本生成到更复杂的图像、音频甚至视频生成。如今&#xff0c;AIGC 已经不仅仅是技术研究中的一个概念&#…

运维智能化转型:AIOps引领IT运维新浪潮

1. AIOps是什么&#xff1f; AIOps&#xff08;Artificial Intelligence for IT Operations&#xff09;&#xff0c;即人工智能在IT运维中的应用&#xff0c;通过机器学习技术处理运维数据&#xff08;如日志、监控信息和应用数据&#xff09;&#xff0c;解决传统自动化运维…

Spring Boot 与 Vue 共筑航空机票预定卓越平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

2024 第五次周赛

A: 直接遍历即可 #include<bits/stdc.h> using namespace std;typedef long long ll; typedef pair<ll, ll>PII; const int N 2e6 10; const int MOD 998244353; const int INF 0X3F3F3F3F;int n, m; int main() {cin >> n;int cnt 0;for(int i 0; i …

斐波那契数的第n个数代码分享(c基础)

1&#xff1a;迭代 //斐波那契数的第n个数 #include<stdio.h> //unsigned long long Fib(n) //{ // // if (1 n || 2 n) // return 1; // else return Fib((n - 1) Fib((n - 2); // // //} unsigned long long Fib(n) {if (n 1 || n 2)return 1;else{int j 3;u…

STM32单片机WIFI语音识别智能衣柜除湿消毒照明

实践制作DIY- GC0196-WIFI语音识别智能衣柜 一、功能说明&#xff1a; 基于STM32单片机设计-WIFI语音识别智能衣柜 二、功能介绍&#xff1a; STM32F103C系列最小系统板LCD1602显示器ULN2003控制的步进电机&#xff08;柜门开关&#xff09;5V加热片直流风扇紫外消毒灯DHT11…

qt QShortcut详解

1、概述 QShortcut是Qt框架中的一个类&#xff0c;它提供了一种创建键盘快捷键的方式。通过QShortcut&#xff0c;开发者可以将特定的键盘组合&#xff08;如CtrlC、AltF4等&#xff09;与应用程序中的动作&#xff08;如复制、关闭窗口等&#xff09;关联起来。当用户在应用程…

C语言笔记(字符串函数,字符函数,内存函数)

目录 前言 1.字符串函数 1.1.strlen 1.2.strcpy 1.3.strcat 1.4.strcmp 1.5.strncpy 1.6.strncat 1.7.strncmp 1.8.strstr 1.9.strtok 1.10.strerror 2.字符函数 2.1字符分类函数 2.2字符转换函数 3.内存函数 3.1.mencpy 3.2.memmove 3.3.memcmp 前言 本文重…