字符串的窗口滑动问题

问题:一个字符串S(暂时只考虑小写字母),选择S中包含26种英文字母的最短子串,如果不包含则返回空字符

分析:双指针,动态维护一个区间。尾指针不断往后扫,当扫到有一个窗口包含了所有26种英文字母的字符串后,再收缩头指针,直到不能再收缩为止。最后记录所有可能的情况中窗口最小的。

代码示例:

#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
const int UPPERALPHA_MAX = 26;

class Solution {

public:
	int appeared_count[UPPERALPHA_MAX];

public:
	//判断是否已找到包含26种英文字母的字符串
	bool ContainAllAlpha(){
		for(int i=0;i<26;i++){
			if(appeared_count[i]<=0)
				return false;
		}
		return true;
	}

	//寻找符合条件的最小子串
	string minWindow(string S) {
		if (S.empty()) return "";
		if (S.size() < 26) return "";
		fill(appeared_count, appeared_count + UPPERALPHA_MAX, 0);
		size_t minWidth = INT_MAX, min_start = 0;  // 窗口大小,起点
		int wnd_start = 0;
		//尾指针不断往后扫
		for (size_t wnd_end = 0; wnd_end < S.size(); wnd_end++) {
			appeared_count[S[wnd_end]-'a']++;//统计当前各英文字母出现的次数
			//当ContainAllAlpha()第一次为true后,其后的判断均为ture,后面程序运行的目的是找出最短的子串
			if(ContainAllAlpha()){ //如果为true则包含了所有的26个英文字母
				while(true){
					//如果重复出现了,可以后移
					if(appeared_count[S[wnd_start]-'a']>1){
						appeared_count[S[wnd_start]-'a']--;
						wnd_start++;
					}
					else //只出现了一次,停止后移
						break;
				}
				//找出最短子串,更新最短长度,和最短长度的起点
				if (minWidth > (wnd_end - wnd_start + 1)) {
					minWidth = wnd_end - wnd_start + 1;
					min_start = wnd_start;
				}
			}
		}
		if(minWidth!=INT_MAX)
			return S.substr(min_start, minWidth);
		else
			return "";
	}
};

int main(){
	string s="aabcdefghhhiijkijkjkijkkklmnopqrstuvzzzwxyzzcbabcdefghijklmnopqrstuvwxxyz";
	Solution solution;
	cout<<solution.minWindow(s)<<endl;
}

输出结果为:abcdefghijklmnopqrstuvwxxyz

类似题目链接点击打开链接

时间: 2024-12-14 06:25:20

字符串的窗口滑动问题的相关文章

Unique Snowflakes(窗口滑动)

题目: Emily the entrepreneur has a cool business idea: packaging and selling snowflakes. She has devised a machine that captures snowflakes as they fall, and serializes them into a stream of snowflakes that flow, one by one, into a package. Once the pa

sed修炼系列(三):sed高级应用之实现窗口滑动技术

html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary { display: block } audio,canvas,progress,video { display: inline-block; vertical-align: baseline } audio:not([co

HDU 5056 Boring count(窗口滑动法)

题目地址:HDU 5056 我晕啊..当时绝壁脑残了...当时想到的方法是完全正确的..但是在脑算第二个样例的时候,居然一直把前三个abc当成了9种...于是后面的三个abc每个都要递增2,而不是我想的方法中的递增3...于是一直没写代码... 言归正传.. 这题的思路就是窗口滑动,两个指针,让指针内的始终保持每个字母的数量少于k个.然后递推过去.然后因为每次右指针往右移动一个的时候,就相当于右指针当前指的数可以与左边的每一个之间都形成一个子序列.所以要增加当前窗口的数量. 代码如下: #inc

TCP的窗口滑动机制

TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性.同时滑动窗口机制还体现了TCP面向字节流的设计思路. 可靠:对发送的数据进行确认 流控制:窗口大小随链路变化. 一.tcp窗口机制 tcp中窗口大小是指tcp协议一次传输多少个数据.因为TCP是一个面向连接的可靠的传输协议,既然是可靠的就需要对传输的数据进行确认.TCP的窗口机制有两种,一种是固定窗口大小,另一种是滑动窗口.数据在传输时,TCP会对所有数据进行编号,发送方在发送过程中始终保持着一个窗口,只有落在发送

子字符串模板 (双指针, 滑动窗口)

? 对于大多数子字符串问题,我们给了一个字符串,需要找到一个满足某些限制的子字符串.通常的方法是使用带有两个指针的哈希表.模板如下. public int findSubstring(string s){ Map<Character, Integer> map = new HashMap<>(): //也可用256长度的数组代替, int[] map = new int[256]; int counter; // check whether the substring is val

tcp窗口滑动以及拥塞控制(转)

转自:http://blog.chinaunix.net/uid-26275986-id-4109679.html TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议     关于这部分自己不晓得怎么叙述才好,因为理解的部分更多,下面就用自己的理解来介绍下TCP的精髓:滑动窗口协议.     所谓滑动窗口协议,自己理解有两点:1. "窗口"对应的是一段可以被发送者发送的字节序列,其连续的范围称

计算机网络【七】:可靠传输的实现 (tcp窗口滑动以及拥塞控制)【转】

转自:http://blog.chinaunix.net/uid-26275986-id-4109679.html TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议     关于这部分自己不晓得怎么叙述才好,因为理解的部分更多,下面就用自己的理解来介绍下TCP的精髓:滑动窗口协议.     所谓滑动窗口协议,自己理解有两点:1. "窗口"对应的是一段可以被发送者发送的字节序列,其连续的范围称

tcp窗口滑动以及拥塞控制

TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议关于这部分自己不晓得怎么叙述才好,因为理解的部分更多,下面就用自己的理解来介绍下TCP的精髓:滑动窗口协议.所谓滑动窗口协议,自己理解有两点:1. "窗口"对应的是一段可以被发送者发送的字节序列,其连续的范围称之为"窗口":2. "滑动"则是指这段"允许发送的范围"是可以随着发送的过程

字符串的窗体滑动问题

问题:一个字符串S(临时仅仅考虑小写字母),选择S中包括26种英文字母的最短子串.假设不包括则返回空字符 分析:双指针,动态维护一个区间.尾指针不断往后扫,当扫到有一个窗体包括了全部26种英文字母的字符串后.再收缩头指针.直到不能再收缩为止.最后记录全部可能的情况中窗体最小的. 代码演示样例: #include <algorithm> #include <string> #include <iostream> using namespace std; const int