子字符串的最小窗口问题

给定两个字符串T和S,找出在S中包含字符串T的最小子字符串,要求时间复杂度为O(n)。

如果不存在最小窗口,则返回”“;

例如,

S = "ADOBECODEBANC"

T = "ABC"

返回的最小窗口是"BANC".

实验的代码如下所示:

#include<iostream>
#include<string>
#include<vector>
using namespace std;
string minWindow(string &S, string &T)
{
	int Slen = S.length();
	int Tlen = T.length();
	if (Slen < Tlen || T.empty())
	{
		return "";
	}
	vector<int> ToBeFind(128, 0);
	vector<int> Found(128, 0);
	for (int i = 0; i != Tlen; ++i)
	{
		ToBeFind[T[i]]++;
	}
	int Count = Tlen;
	int first = 0;
	int last = 0;
	int minfirst = 0;
	int minlast = 0;
	int minlength = INT_MAX;
	Found[S[0]]++;
	if (Found[S[0]] <= ToBeFind[S[0]])//先比较第一个字符是为了处理T为单个字符的特例
	{
		Count--;
	}
	while (true)
	{
		if (Count == 0)
		{
			while (Found[S[first]] > ToBeFind[S[first]])
			{
				Found[S[first]] --;
				first++;
			}
			int length = last - first + 1;
			if (length < minlength)
			{
				minfirst = first;
				minlast = last;
				minlength = length;
			}
		}
		if (last < Slen)
		{
			last++;
			Found[S[last]]++;
			if (Found[S[last]] <= ToBeFind[S[last]])
			{
				Count--;
			}
		}
		else
		{
			break;
		}
	}
	if (minlength == INT_MAX)
	{
		return "";
	}
	return S.substr(minfirst, minlength);
}
int main()
{
	string S1 = "ADOBECODEBANC";
	string S2 = "ABC";
	string S3 = "A";
	cout << minWindow(S1, S2) << endl;
	cout << minWindow(S3, S2) << endl;
	system("pause");
	return 0;
}

实验结果如下所示:

时间: 2024-11-26 02:34:45

子字符串的最小窗口问题的相关文章

字符串匹配算法一:查找子字符串

[题目] 就是给一个很长的字符串str 还有一个字符集比如{a,b,c} 找出str里包含{a,b,c}的最短子串.要求O(n). [例子] 字符集是a,b,c,字符串是abdcaabcx,则最短子串为abc. [分析] 有题意可知,满足要求的字符串只需要包括字符集中的所有字符,并没有顺序要求 当然最容易想到的是做一个字符匹配的过程,但题目要求查找次数为O(n),在思考了几种解决方法后,觉得下面的方案能够达到要求,虽然需要一些额外的空间. 下面我给出自己的解决方案,难免有遗漏的地方,如果路过的朋

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

? 对于大多数子字符串问题,我们给了一个字符串,需要找到一个满足某些限制的子字符串.通常的方法是使用带有两个指针的哈希表.模板如下. 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

LeetCode最小窗口子字符串以及求解子字符串模板

LeetCode原题地址 题干: 给定字符串S和T,以O(n)复杂度在S中找出包含T中所有字符的最小窗口子字符串. 示例: S = "ADOBECODEBANC"T = "ABC" 最小窗口是"BANC". 备注: 如果没有结果,返回空字符串"". 如果有多个窗口,保证只有一个最小解. Discuss中的答案(并且给出了一个求解所有子字符串问题的模板): 原题的解: 1 string minWindow(string s, s

5325包含所有三种字符的子字符串数目

题目:给你一个字符串 s ,它只包含三种字符 a, b 和 c .请你返回 a,b 和 c 都 至少 出现过一次的子字符串数目. 链接:https://leetcode-cn.com/problems/number-of-substrings-containing-all-three-characters/ 法一:自己的代码 思路:刚开始的思路是利用类似戳气球的方法,dp[i][j]表示字符串中从i到j的符合条件的字符串的个数,进而推导从dp[i+1][j]和dp[i][j-1]如何计算出dp[

Minimum Window Substring, 包含子串的最小窗口,双指针

问题描述:给定字符串S,子串T,求S中包含T的最小窗口 Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n). For example,S = "ADOBECODEBANC"T = "ABC" Minimum window is "BANC". 算法分析:

[LeetCode] Minimum Window Substring 最小窗口子串

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n). For example,S = "ADOBECODEBANC"T = "ABC" Minimum window is "BANC". Note:If there is no such window i

Minimum Window Substring 最小窗口子串问题

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n). Example: Input: S = "ADOBECODEBANC", T = "ABC" Output: "BANC" Note: If there is no such window in S

shell 中获取子字符串的正确姿势

前言 shell 取子串的方式有点特别,你写的匹配字符串是需要从头开始匹配的,第一个匹配到了才开始匹配下一个,这个类似于python中的match的工作方式. 1,获取子串有两种方式 使用字符串匹配的方式去截取.其中匹配的方式和python中的match的工作方式很像,只是其截取的是那些 没有匹配 到的字符串而已. 使用下标的方式去截取 2,匹配的方式 2.1, 左边开始匹配 #:最小限度开始匹配 ##:最大限度开始匹配 案例: ????str="hello~world~~~Ha" ?

LeetCode | 1358. Number of Substrings Containing All Three Characters包含所有三种字符的子字符串数目【Python】

LeetCode 1358. Number of Substrings Containing All Three Characters包含所有三种字符的子字符串数目[Medium][Python][双指针][滑窗] Problem LeetCode Given a string s consisting only of characters a, b and c. Return the number of substrings containing at least one occurrence