尺取法是在线性结构中进行搜寻满足某一条件的区间的方法。

该方法保存两个索引——首索引begin、尾索引end。判断 [begin, end] 区间是否满足条件。

移动 [begin, end] 区间的方法是将 end 固定,begin 向前移动,得到中间区间 [begin + 1, end],随后将 end 再向前移动,直到找到满足条件的区间。

在 begin 往前移动之后,[begin + 1, end] 区间的状态都已经保存,无需再次进行计算其中的状态。这一部分是尺取法比 Brute-Force 高效的关键。

这种方法的移动过程有点像尺蠖,日本语叫尺取法,这种昆虫的移动过程为:(头部固定,撅起屁股,把尾部向前移动)-> (尾部固定,放下屁股,把头部向前移动)。

以上是尺取法的简介。

下面是例题:

牛客网:[编程题]彩色宝石项链

https://www.nowcoder.com/questionTerminal/321bf2986bde4d799735dc9b493e0065

有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链,但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我,这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。请帮助学者找出如何切分项链才能够拿到最多的宝石。

输入描述:

我们用每种字符代表一种宝石,A表示红宝石,B表示蓝宝石,C代表紫水晶,D代表翡翠,E代表钻石,F代表玉石,G代表玻璃等等,我们用一个全部为大写字母的字符序列表示项链的宝石序列,注意项链是首尾相接的。每行代表一种情况。

输出描述:

输出学者能够拿到的最多的宝石数量。

代码:

#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
while(cin>>s){
int begin = 0, end = 0;
int len = s.size(), minLen = s.size();
int book[5] = {0, 0, 0, 0, 0}; // 这里使用int数组,而不是bool数组,因为int数组可以记录出现的次数,方便begin向前移动。
int num = 0;
while (begin < len){ // 从起点开始
// end 没有置0操作
while ((end < begin + len) && num < 5) {
if (s[end % len] - 'A' < 5) {
book[s[end % len] - 'A']++;
if (book[s[end % len] - 'A'] == 1) {
++num;
}
}
++end;
}
// 遍历一遍都没有能够找到5种宝石,后面都不可能找到了
if (num < 5) break;
minLen = minLen > (end - begin) ? (end - begin) : minLen;
if (s[begin] - 'A' < 5) {
if (--book[s[begin] - 'A'] == 0) {
--num;
}
}
++begin;
}
cout << (len - minLen) << endl;
}
}

相关题目:https://leetcode.com/problems/gas-station/description/

参考:1. http://www.jianshu.com/p/64abe526fe91

[Alg] 尺取法的更多相关文章

  1. 5806 NanoApe Loves Sequence Ⅱ(尺取法)

    传送门 NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K ...

  2. POJ3061 尺取法

    题目大意:从给定序列里找出区间和大于等于S的最小区间的长度. 前阵子在zzuli OJ上见过类似的题,还好当时补题了.尺取法O(n) 的复杂度过掉的.尺取法:从头遍历,如果不满足条件,则将尺子尾 部增 ...

  3. POJ 2739 Sum of Consecutive Prime Numbers(尺取法)

    题目链接: 传送门 Sum of Consecutive Prime Numbers Time Limit: 1000MS     Memory Limit: 65536K Description S ...

  4. CF 701C They Are Everywhere(尺取法)

    题目链接: 传送门 They Are Everywhere time limit per test:2 second     memory limit per test:256 megabytes D ...

  5. nyoj133_子序列_离散化_尺取法

    子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 给定一个序列,请你求出该序列的一个连续的子序列,使原串中出现的所有元素皆在该子序列中出现过至少1次. 如2 8 ...

  6. Codeforces 676C Vasya and String(尺取法)

    题目大概说给一个由a和b组成的字符串,最多能改变其中的k个字符,问通过改变能得到的最长连续且相同的字符串是多长. 用尺取法,改变成a和改变成b分别做一次:双指针i和j,j不停++,然后如果遇到需要改变 ...

  7. POJ 3061 (二分+前缀和or尺取法)

    题目链接: http://poj.org/problem?id=3061 题目大意:找到最短的序列长度,使得序列元素和大于S. 解题思路: 两种思路. 一种是二分+前缀和.复杂度O(nlogn).有点 ...

  8. POJ 3320 尺取法,Hash,map标记

    1.POJ 3320 2.链接:http://poj.org/problem?id=3320 3.总结:尺取法,Hash,map标记 看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识 ...

  9. HDU 5358 尺取法+枚举

    题意:给一个数列,按如下公式求和. 分析:场上做的时候,傻傻以为是线段树,也没想出题者为啥出log2,就是S(i,j) 的二进制表示的位数.只能说我做题依旧太死板,让求和就按规矩求和,多考虑一下就能发 ...

随机推荐

  1. 冲刺Two之站立会议3

    今天继续昨天的工作,对主界面进行设计优化,并成功将各个按钮和对应的功能模块连接了起来.并对服务器部分进行了部分改进,包括登录界面的美观性和服务器数据库部分的处理.

  2. mysql左外连接

    左外连接的概念性不说了,这次就说一说两个表之间的查询步骤是怎么样的? 例如 SELECT ut.id,ut.name,ut.age, ut.sex,ut.status,st.score,st.subj ...

  3. Java 笔记——MyBatis 生命周期

    1.MyBatis 的生命周期 MyBatis的核心组件分为4个部分. SqlSessionFactoryBuilder (构造器): 它会根据配置或者代码来生成SqISessionFactory,采 ...

  4. springmvc关于redisCluster的使用及配置

    首先附上maven仓库jar包的下载地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-loca ...

  5. Photoshop的混合模式

    1.亮度是一种颜色的相对亮度,饱和度是指一种颜色的纯度(颜色中包含多少灰) 2.混合模式 下层图片的颜色像素称为"基本颜色":选定的称为"混合"颜色,对于大部分 ...

  6. linux分区命名

    linux中任何内容都是文件 硬盘 文件 用户 都是文件 硬件设备文件名称 ide硬盘 /dev/hd[a-d] scsi/sata/usb硬盘 /dev/sd[a-p] 光驱 /dev/cdrom/ ...

  7. [转帖] Linux 下面 Find的使用...--- 自己不会用 find

    13个实用的Linux find命令示例  原始博客地址:  https://www.cnblogs.com/chenshoubiao/p/4838089.html   之前只会用locate  基础 ...

  8. java.util.concurrent BlockingQueue详解

    什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用.阻塞 ...

  9. c++ std::function

    std::function 是一个模板类,用于封装各种类似于函数这样的对象,例如普通函数,仿函数,匿名函数等等.其强大的多态能力,让其使用只依赖于调用特征.在程序的升级中,可以实现一个调用表,以兼容新 ...

  10. Centos中安装和配置vsftp简明教程

    一.vsftp安装篇 # 安装vsftpd yum -y install vsftpd # 启动 service vsftpd start # 开启启动 chkconfig vsftpd on 二.v ...