相关知识点
这个算法很容易想到,学习了本文后,可以更快得想到。
前后缀分解
分治法的一种,将数组和字符串,拆分成前缀和后缀。字符串(数组)的前缀是字符串的前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,两者长度相等:
cpp
revs[i] = s [n-1-i]
字符串的前缀(后缀)就是转置字符串的后缀(前缀),顺序相反 。如:"abcde"长度为3的前缀是:abc de,转置字符串长度为3的后缀是:edcba 。许多时候和顺序无关,可以直接使用,如:子数组最大和、是否存在指定和的子数组、指定元素的数量。如果和顺序有关,则需要转换,比如:升序变成降序,起点变成终点。
二维数组处理起来麻烦,可以降维为一维数组后再处理。
相关题解
部分题解已经完成,逐步发布中。
扩展阅读
我想对大家说的话 |
---|
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。 |
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作 |
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注 |
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。 |
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。 |
如果程序是一条龙,那算法就是他的是睛 |
失败+反思=成功 成功+反思=成功 |
视频课程
先学简单的课程,请移步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++**实现。