首页 > 编程语言 >C++前后缀分解

C++前后缀分解

时间:2024-09-17 18:56:14浏览次数:3  
标签:前缀 后缀 C++ 算法 分解 数组 字符串

相关知识点

C++算法与数据结构
打开打包代码的方法兼述单元测试
这个算法很容易想到,学习了本文后,可以更快得想到。

前后缀分解

分治法的一种,将数组和字符串,拆分成前缀和后缀。字符串(数组)的前缀是字符串的前i个元素:s.substr(0,i-1),即s[0] … \dots … s[i-1]。同理后缀就是字符串s的后几个元素(字符)。
不失一般型,我们以字符串s=“abcde"为例,s有5种拆分方法:

“”“abcde”
“a”“bcde”
“ab”“cde”
“abc”“de”
“abcd”“e”
“abcde”“”

如果字符串的长度为n,则共有n+1中划分法,前缀长度分别为:i ∈ \in ∈[0,n],后缀长度分别为n-i。
一般分三步:
一,预处理前缀。
二,预处理后缀。
三,枚举前后缀的拆分方法。

取走水果

条桌上有若干梨和苹果,求最少取走多少水果,才能没有苹果在梨左边。我们将水果分成左(前缀)、右(后缀)两部分,前缀只有梨,取走所有苹果;后缀只有苹果,取走所有梨。分别枚举前缀的长度。如下图,初始梨苹果梨苹果梨,各划分方案:红色竖线之前是梨,红色竖线之后是苹果:
在这里插入图片描述

转置字符串(数组)

将字符串s前后颠倒就是转置字符串revs,两者长度相等:

revs[i] = s [n-1-i]

字符串的前缀(后缀)就是转置字符串的后缀(前缀),顺序相反。如:"abcde"长度为3的前缀是:abcde,转置字符串长度为3的后缀是:edcba。许多时候和顺序无关,可以直接使用,如:子数组最大和、是否存在指定和的子数组、指定元素的数量。如果和顺序有关,则需要转换,比如:升序变成降序,起点变成终点。
二维数组处理起来麻烦,可以降维为一维数组后再处理。

相关题解

部分题解已经完成,逐步发布中。

难度分
【C++前后缀分解】1031. 两个非重叠子数组的最大和1680
【C++前缀和】2420. 找到所有好下标1695
【C++前后缀分解 动态规划】2100. 适合野炊的日子1702
【C++二分查找 】1477. 找两个和为目标值且不重叠的子数组1850
【C++前后缀分解】1653. 使字符串平衡的最少删除次数1793
【二分算法】1671:得到山形数组的最少删除次数1912
【C++前后缀分解】1888. 使二进制字符串字符交替的最少反转次数2005
【C++前后缀分解 降维】2906. 构造乘积矩阵2074
【动态规划】【字符串】2167移除所有载有违禁货物车厢所需的最少时间2219
【C++前后缀分解】2484. 统计回文子序列数目2223
【堆 优先队列】2163. 删除元素后和的最小差值2225
【二分查找】【双指针】LeetCode:2565最少得分子序列2432
【动态规划】【滑动窗口】C++算法:3003 执行操作后的最大分割数量3039

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

标签:前缀,后缀,C++,算法,分解,数组,字符串
From: https://blog.csdn.net/he_zhidan/article/details/142147497

相关文章

  • C++类和对象
    1.类的定义1.1类的格式(1)class为定义的类关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面要跟分号。(2)为了区分类中的成员变量,一般我们命名的时候会在前面加上_或m开头,这个不是硬性要求。(3)C++中也兼容struct的用法,struct升级成了类,但他仍兼容C语言的用法,同......
  • C++模板函数实现类型推导
    C++模板函数实现类型推导以快读函数举例说明无法类型推导的情况template<typenameT>inlineTread(){Tx=0;intf=1;charch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar(......
  • VScode快速配置c++(菜鸟版)
    1.vscode是什么VisualStdioCode简称VSCode,是一款跨平台的、免费且开源的现代轻量级代码编辑器,支持几乎主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性,也拥有对git的开箱即用的支持。同时,它还支持插件扩展,通过丰......
  • C++内存管理详解:各类变量的存储区域
      在C++中,变量的存储位置取决于它们的类型和生命周期。那么不同的各个变量究竟存储在哪个区域呢?1.不同类型的变量我们首先从变量类型的不同来说明:1.全局变量和静态变量 -存储区:全局/静态区(静态区)-说明:全局变量(包括文件级和函数级的)和使用`static`关键字声明的变......
  • C++的类与对象下
    目录1.初始化列表2.隐式类型转换1.单参数2.多参数(C++11提供的新功能)3.static成员4.友元5.内部类6.匿名对象1.初始化列表C++祖师爷规定初始化列表是成员变量定义与初始化的地方。classTime{public: Time(inthour) :_hour(hour) { cout<<"Time()"<<......
  • 4.C++中程序中的命名空间
    咱们在前面的程序中,提到过使用usingnamespacestd;引入这个命名空间,那么std就是由编程系统提供的标准命名空间,那什么是命名空间呢?想像一下,比如一个年级的学生,在记录的时候出现了重名的情况,那么这个时候应该怎么记录呢,是不是需要加一些其它的名称,比如,一三班小李同学,一一班小李......
  • C++信奥老师解一本通题 1370:最小函数值(minval)
    ​【题目描述】有n个函数,分别为F1,F2,...,Fn。定义Fi(x)=Ai*x*x+Bi*x+Ci(x∈N∗)。给定这些Ai、Bi和Ci,请求出所有函数的所有函数值中最小的mm个(如有重复的要输出多个)。【输入】第一行输入两个正整数n和m。以下nn行每行三个正整数,其中第ii行的三个数分别位Ai、Bi和Ci输入数......
  • C++:多态
    目录一.多态的概念二.多态的定义及其实现1.虚函数2.虚函数的重写/覆盖3.实现多态的条件 4.虚函数重写的例外5.析构函数的重写6.经典例题7.C++11override和final关键字8.重载、重写/覆盖、隐藏的区别三.抽象类四.多态的原理1.虚函数表指针2.多态如何实现3.动态......
  • C++面试考点:拷贝赋值运算符和拷贝构造函数有什么区别?
    定义和功能拷贝构造函数拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,该新对象是作为另一个同类型对象的副本而创建的。其函数原型通常为类名(const类名&other)(在C++11之前,const也可省略)。例如:classMyClass{public:MyClass(constMyClass&ot......
  • C++11 线程同步接口std::condition_variable和std::future的简单使用sk
    合集-C++(1)1.C++11线程同步接口std::condition_variable和std::future的简单使用09-17收起std::condition_variable条件变量std::condition_variable有wait和notify接口用于线程间的同步。如下图所示,Thread2阻塞在wait接口,Thread1通过notify接口通知Thread2继续执行。......