关闭

LeetCode76——Minimum Window Substring

标签: leetcodemap
1094人阅读 评论(0) 收藏 举报
分类:

LeetCode76——Minimum Window Substring

以前似乎做过类似的,点了LeetCode类似题想起来了(这点把不同类型的题目分类真心不错)

好了,跟LeetCode30——Substring with Concatenation of All Words很相似,需要维护一个Map。

当时做这题的时候就感觉自己做得非常不智能,有点像朴素的字符串的模式匹配,效率比较低。

做这题的时候也比较吃力。

言归正传。

--------------------------------------------------------------------------------------------

这题的意思是:

从母串S中找到这样一个子串W,这个子串包含目标T串中的所有字符,并且该子串的长度最短。


思路:

维护两个索引Start 和 End(初值都为0),分别标识 子串W(这里表示Window)的开始位置和结束位置。

下面关键就是判断何时这两个索引要变化。


1.首先如果没有找到map中的单词,End++,继续往后找。


2.如果map中的字母还没找完,且找到了当前字母,则map中当前单词对应的value--(表示找到一个)。


3.当然可能有重复字母,即value减为负了,这样找出来的window包含多余重复字母肯定不是最优,所以我们要记录找到字母个数。


4.一旦找满单词,这个时候Start到End的位置肯定是包含目标T串所有字符的子串W(即Window)


5.但是这个window不是最优的,我们要对start++,排除不在map中的字符(其实就是让Start越过步骤1中跳过的字符),缩小window大小


6.还有需要优化的地方,就是当window中出现重复的字符,这时,map中该字符的value为负了,我们可以向前移动start。


关于第6点,比如说:

母串ABCDDDDDDDA

目标串ABC

那么当End移动到最后一个A时,Start只能停在第一个A处(为了保证Window中包含ABC三个字母)

而当End移动到最后一个A时,此时Window中多一个A(Map中A的值减为负了),这个时候Start就可以往前移动一下,做一步优化。


根据上述6点,代码就很容易了:


class Solution{
public:
	string minWindow(string s, string t){
	    if(s.size()<t.size())
	        return "";
		map<char, int>chrMap;//保存最初的字母
		for (int i = 0; i < t.size(); i++)
		{
			chrMap[ t[i] ]++;
		}
		int start = 0;
		int end = 0;
		int count = 0;//window中包含所需字符的数量
		int minWindowLen = INT_MAX;
		int curWindow;//当前window大小
		int minStart = 0;//当前window最小值时start的位置
		int minEnd = 0;//当前window最小值时end的位置
		map<char, int>tempMap(chrMap.begin(), chrMap.end());//临时map,用于计算
		while (end < s.size())
		{
			if (tempMap.find(s[end]) == tempMap.end())
			{
				end++;
				continue;
			}
			tempMap[s[end]]--;
			if (tempMap[s[end]] >= 0)
				count++;
			if (count == t.size())//找满一次窗口
			{
				while (start != end)
				{
					if (chrMap.find(s[start]) == chrMap.end())//start不在T的map里面
					{
						start++;
						continue;
					}
					if (tempMap[s[start]] < 0)//window中对于同一字符找重了,此时要向前移动并且补上
					{
						tempMap[s[start]]++;
						start++;
						continue;
					}
					else
						break;
				}
				curWindow = end - start + 1;
				//curWindow = min(curWindow, minWindowLen);
				if (curWindow < minWindowLen)
				{
					minWindowLen = curWindow;
					minStart = start;
					minEnd = end;
				}
			}
			end++;
		}
		if (minWindowLen == INT_MAX)
			return "";
		return s.substr(minStart, minWindowLen);
	}
};



0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

LeetCode(76)Minimum Window Substring

题目如下: Given a string S and a string T, find the minimum window in S which will contain all the chara...
  • feliciafay
  • feliciafay
  • 2015-03-22 08:05
  • 1718

leetcode 76

题意 :给定一个字符串S和T,找出S中包含T所有字符的最小子串。
  • u013115610
  • u013115610
  • 2017-04-20 13:32
  • 363

LeetCode --- 76. Minimum Window Substring

题目链接:Minimum Window Substring Given a string S and a string T, find the minimum window in S which w...
  • makuiyu
  • makuiyu
  • 2015-03-23 21:26
  • 2010

Leetcode 76. Minimum Window Substring

Given a string S and a string T, find the minimum window in S which will contain all the characters ...
  • sundawei2016
  • sundawei2016
  • 2017-07-16 23:25
  • 77

Minimum Window Substring -- LeetCode

原题链接: http://oj.leetcode.com/problems/minimum-window-substring/  这道题是字符串处理的题目,和Substring with Conca...
  • linhuanmars
  • linhuanmars
  • 2014-03-03 04:23
  • 21517

Minimum Window Substring 最小覆盖子串算法

题目  最小子串覆盖  描述 笔记  数据  评测 给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。 您在真...
  • fly_yr
  • fly_yr
  • 2016-04-12 16:13
  • 3103

[leetcode] 76. Minimum Window Substring 解题报告

题目链接:https://leetcode.com/problems/minimum-window-substring/ Given a string S and a string T, f...
  • qq508618087
  • qq508618087
  • 2016-06-09 07:26
  • 1678

leetcode -- Minimum Window Substring -- 重点,应该会考

https://leetcode.com/problems/minimum-window-substring/思路: 解题思路:双指针思想,尾指针不断往后扫,当扫到有一个窗口包含了所有T的字符,然后...
  • xyqzki
  • xyqzki
  • 2015-12-22 21:31
  • 395

[Leetcode]76. Minimum Window Substring @python

题目Given a string S and a string T, find the minimum window in S which will contain all the character...
  • qian2729
  • qian2729
  • 2016-01-21 21:52
  • 378

[python]leetcode(76). Minimum Window Substring

problem Given a string S and a string T, find the minimum window in S which will contain all th...
  • PKU_Jade
  • PKU_Jade
  • 2017-09-17 17:12
  • 92
    个人资料
    • 访问:603063次
    • 积分:12057
    • 等级:
    • 排名:第1424名
    • 原创:587篇
    • 转载:83篇
    • 译文:1篇
    • 评论:41条
    博客专栏
    最新评论