C++知识点总结(8):尺取法

2023-12-10 18:36
文章标签 c++ 知识点 总结 取法

本文主要是介绍C++知识点总结(8):尺取法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

尺取法

  • 一、复习枚举算法
    • 1. 算法三要素
    • 2. 最小公倍数公式
    • 3. 时间复杂度
  • 二、算法优化初级
    • 1. 概念
    • 2. 例题
      • (1) 最长小写子串
        • Ⅰ 初步算法
        • Ⅱ 认识尺取法
        • Ⅲ 尺取法程序
      • (2) 最长递增子串
      • (3) 最小子串和
        • Ⅰ 伪代码
        • Ⅱ 完整代码
      • (4) 最短字符串包含
        • Ⅰ 伪代码
      • Ⅱ 代码

一、复习枚举算法

1. 算法三要素

【枚举对象】要枚举的对象
【枚举范围】每一个枚举对象从几开始,到几结束
【筛选条件】筛选满足一定条件的数据

2. 最小公倍数公式

假如现在要求整数 a a a 和整数 b b b 的最小公倍数。
求解公式如下:
a × b = g c d ( a , b ) × l c m ( a , b ) a \times b = gcd(a, b) \times lcm(a, b) a×b=gcd(a,b)×lcm(a,b)

3. 时间复杂度

一般指程序运行的最大次数,不能超过 1 0 8 10^8 108 ,即 1 e 8 1e8 1e8 ,时间复杂度越高,程序运行时间越长。

二、算法优化初级

1. 概念

通过针对题型的方式,来使算法的某一方面变得更强的过程(包括用时更短、空间更小)。

2. 例题

(1) 最长小写子串

【题目描述】

给定一个由若干大写小写字符组成的字符串 s t r str str ,现在请你求出 s t r str str 中最长的小写子串的长度。如果没有,则输出 0 0 0

【输入描述】

1行,包含一个字符串 s t r str str

【输出描述】

1行,包含最长小写子串的长度。

【样例1】

输入

abcdeACzxc

输出

5

【概念】

当串 a 中连续包含串 b 的所有元素时,
串 a 是串 b 的父串;
串 b 是串 a 的子串。
例如 a b c d e f g abcdefg abcdefg c d e cde cde 的子串。

Ⅰ 初步算法
for (int i = 0; i <= len-1; i++)
{for (int j = i; j <= len-1; j++){bool flag = true;for (int k = i; k <= j; k++){if (a[k] >= 'A' && a[k] <= 'Z'){bool flag = true;break;}}if (flag){// ...}}
}
// 打擂台...
// 输出...
Ⅱ 认识尺取法

尺取法,又称双指针法,是一种针对子串枚举问题的优化算法。
在上述题目中,可用用下面的伪代码来表示。

while (l < len) // 左指针没有到结尾
{if ((s[r] >= 'a' && s[r] <= 'z') && r < len) // 右指针在小写字母上并且不在结尾{r++;}erelse{max(..., r-l)l = r + 1;r = l;}
}
Ⅲ 尺取法程序
#include <iostream>
#include <string>
using namespace std;int main()
{// 输入string s;cin >> s;// 尺取法int len = s.length();int l = 0, r = 0; // l 表示左端点, r 表示右端点int maxlen = 0;while (l < len){if (s[r] >= 'a' && s[r] <= 'z' && r < len) // 右指针在小写字母上并且不在结尾{r++;}else{maxlen = max(maxlen, r-l);l = r + 1; // 移动左指针 r = l; // 右指针和左指针一起移动 }}// 输出cout << maxlen; return 0;
}

(2) 最长递增子串

#include <iostream>
#include <string> 
using namespace std;int main()
{// 输入int n, s[10005] = {};cin >> n;for (int i = 0; i <= n-1; i++){cin >> s[i];} // 尺取法int l = 0, r = 0, maxlen = 1;while (l < n){if (s[r] < s[r+1] && r < n){r++;}else{maxlen = max(maxlen, r-l+1);l = r + 1;r = l;}}// 输出cout << maxlen;return 0; return 0;
}

(3) 最小子串和

Ⅰ 伪代码
while (l < len)
{if (sum < 9 && r < len){sum += a[r];r++;}else{if (sum >= 9){// 更新 r-lsum -= a[l];l++;}}
}
Ⅱ 完整代码
#include <iostream>
using namepace std;int main()
{// 输入int n, s, a[10005] = {};cin >> n;for (int i = 0; i <= n-1; i++){cin >> a[i];}cin >> s;// 尺取法int l = 0, r = 0, minlen = 1e8, sum = 0;while (l < n){if (sum < s && r < n){sum += a[r];r++;}else{if (sum >= s){minlen = min(minlen, r-l);}sum -= a[l];l++;}}// 输出if (minlen == 1e8){cout << 0;}else{cout << minlen;}return 0;
}

(4) 最短字符串包含

Ⅰ 伪代码
while (l < len)
{if (sum <= 26 && r < len) // sum 表示出现了多少个不同的字母{cnt[s[r]]++;if (cnt[s[r]] == 1){sum++;}r++;}else{if (sum >= 26){minlen = min(minlen, );}cnt[s[l]]--;l++;}
}

Ⅱ 代码

#include <iostream>
#include <string>
using namespace std;int main()
{string s;cin >> s;int len = s.length();int l = 0, r = 0;int cnt[130] = {};int sum = 0;int minlen = 1e8;while (l < len){if (sum < 26 && r < len){cnt[s[r]]++;if (cnt[s[r]] == 1) sum++;r++;}else{if (sum >= 26){minlen = min(minlen, r-l);}cnt[s[l]]--;if (cnt[s[l]] == 0){sum--;}l++;}}cout << minlen;return 0;
}

这篇关于C++知识点总结(8):尺取法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/477965

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)