Leetcode 76. 最小覆盖子串(滑动窗口)

本文探讨了一道被标记为困难的LeetCode题目76:最小覆盖子串,分享了作者的解题思路、代码实现及自我评价,适合深入理解滑动窗口技巧的读者。

Leetcode 76. 最小覆盖子串
在这里插入图片描述

心情有点难受最近一段时间,第二次做的leetcode?第一个题自然是两数之和了,笑死,就是它这不是main这种,而是这种模块化的提交方式写着有点让人不舒服就是说,我还是选择写个main再复制上去改改…
就一个普通的滑动窗口的题目,唯一值得稍微用心点的是那两个map的处理,反正我在这又debug了好久…但是de完后就一次过了
附上自己的代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s, t;
	cin >> s >> t;
	map<int, int>m,m1;
	for (auto i : t)
		m[i]++;
	int i = 0, j = -1;
	int tar = t.length();
	int slen = s.length();
	int cnt = 0;
	int minv = slen;
	int mini = 0;
	while (1)
	{

		if (cnt < tar)
		{
			j++;
			if (j >= slen)
				break;
			if (m[s[j]])
			{
				if (m1[s[j]] < m[s[j]])
					cnt++;
				m1[s[j]]++;
			}
		}
		else if(cnt == tar)
		{
			if (j - i < minv)
			{
				minv = j - i;
				mini = i;
			}
			if (m1[s[i]] == m[s[i]]&&m[s[i]])
			{
				m1[s[i]]--;
				cnt--;
			}
			else if (m1[s[i]] > m[s[i]])
				m1[s[i]]--;
			i++;
		}
	}
	if (mini == 0 && minv == slen)
		cout << "zero";
	else
	{
		for (int i = mini; i <= mini+minv; i++)
			cout << s[i];
	}
}

啊,复制错了,这是我main函数的代码,应该附上leetcode的

class Solution {
public:
    string minWindow(string s, string t) {
	map<int, int>m,m1;
	for (auto i : t)
		m[i]++;
	int i = 0, j = -1;
	int tar = t.length();
	int slen = s.length();
	int cnt = 0;
	int minv = slen;
	int mini = 0;
	while (1)
	{

		if (cnt < tar)
		{
			j++;
			if (j >= slen)
				break;
			if (m[s[j]])
			{
				if (m1[s[j]] < m[s[j]])
					cnt++;
				m1[s[j]]++;
			}
		}
		else if(cnt == tar)
		{
			if (j - i < minv)
			{
				minv = j - i;
				mini = i;
			}
			if (m1[s[i]] == m[s[i]]&&m[s[i]])
			{
				m1[s[i]]--;
				cnt--;
			}
			else if (m1[s[i]] > m[s[i]])
				m1[s[i]]--;
			i++;
		}
	}
	if (mini == 0 && minv == slen)
		return "";
	else
	{
        string re;
		for (int i = mini; i <= mini+minv; i++)
			re+=(s[i]);
        return re;
	}
    return "helloworld";
    }
};

emm,怎么评价好呢…这个标记为困难的题好像有点简单

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值