[Alg] 尺取法
尺取法是在线性结构中进行搜寻满足某一条件的区间的方法。
该方法保存两个索引——首索引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] 尺取法的更多相关文章
- 5806 NanoApe Loves Sequence Ⅱ(尺取法)
传送门 NanoApe Loves Sequence Ⅱ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K ...
- POJ3061 尺取法
题目大意:从给定序列里找出区间和大于等于S的最小区间的长度. 前阵子在zzuli OJ上见过类似的题,还好当时补题了.尺取法O(n) 的复杂度过掉的.尺取法:从头遍历,如果不满足条件,则将尺子尾 部增 ...
- POJ 2739 Sum of Consecutive Prime Numbers(尺取法)
题目链接: 传送门 Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Description S ...
- CF 701C They Are Everywhere(尺取法)
题目链接: 传送门 They Are Everywhere time limit per test:2 second memory limit per test:256 megabytes D ...
- nyoj133_子序列_离散化_尺取法
子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 给定一个序列,请你求出该序列的一个连续的子序列,使原串中出现的所有元素皆在该子序列中出现过至少1次. 如2 8 ...
- Codeforces 676C Vasya and String(尺取法)
题目大概说给一个由a和b组成的字符串,最多能改变其中的k个字符,问通过改变能得到的最长连续且相同的字符串是多长. 用尺取法,改变成a和改变成b分别做一次:双指针i和j,j不停++,然后如果遇到需要改变 ...
- POJ 3061 (二分+前缀和or尺取法)
题目链接: http://poj.org/problem?id=3061 题目大意:找到最短的序列长度,使得序列元素和大于S. 解题思路: 两种思路. 一种是二分+前缀和.复杂度O(nlogn).有点 ...
- POJ 3320 尺取法,Hash,map标记
1.POJ 3320 2.链接:http://poj.org/problem?id=3320 3.总结:尺取法,Hash,map标记 看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识 ...
- HDU 5358 尺取法+枚举
题意:给一个数列,按如下公式求和. 分析:场上做的时候,傻傻以为是线段树,也没想出题者为啥出log2,就是S(i,j) 的二进制表示的位数.只能说我做题依旧太死板,让求和就按规矩求和,多考虑一下就能发 ...
随机推荐
- Daily Scrum NO.4
工作概况 符美潇(PM) 昨日完成的工作 1.Daily Scrum.日常会议及日常工作的分配和查收. 2.解决并录入了一个严重的过滤器BUG,该BUG会导致获取子链接的严重异常. 3.在TFS上进行 ...
- WINNER队成立(第二天)
WINNER成立 今天我们主要寻找了两名女生加入到我们的小组当中,她们分别为:李豌湄.江丹仪.有了她们的加入,我们小组可谓如虎添翼啊,嘻嘻.之后我们建立了微信讨论群,经过一番讨论之后,我们决定把小组起 ...
- 选择排序的C、C++实现
一.选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 ...
- 浅谈|WEB 服务器 -- Caddy
浅谈|WEB 服务器 -- Caddy 2018年03月28日 12:38:00 yori_chen 阅读数:1490 标签: caddyserverwebhttps反向代理 更多 个人分类: ser ...
- linux 获取帮助文档
在linux中遇到命令不知道如何使用,可以用man或info来查看. man -f 与 whatis命令是相同的. man -k 与apropos命令是相同的. 而这两个命令又很类似,都是去搜索,找到 ...
- 解决sublime text3下中文无法输入的问题(Ubuntu)
sublime-text-imfix,非常无脑.就喜欢这样的.
- c#public、private、protected、internal、protected internal
public 公有访问.不受任何限制.private 私有访问.只限于本类成员访问,子类,实例都不能访问.protected 保护访问.只限于本类和子类访问,实例不能访问.internal 内部访问. ...
- spring 事务传播 never 当一个业务方法设置为never时候表示 不会加入任何事务中
- pgm10
这部分讨论 MAP 估计.从某个角度上来说,我们可以将这个问题转换成为前面讨论过的: 这样一来我们只需要将原先的 sum-product 换成 max-sum 即可.话虽这么说,我们还是看看 Koll ...
- SpringMVC返回JSON方案
SpringMVC已经大行其道.一般的,都是返回JSP视图.如果需要返回JSON格式,我们大都掌握了一些方法. 在ContentNegotiatingViewResolver之前,一般使用XmlVie ...