18北邮计算机院-D.最长平衡子串 //哈希+贪心

本文详细介绍了一种高效算法,用于解决给定只含0和1的字符串中寻找最长平衡子串的问题。通过将0视为-1并计算前缀和,利用哈希表记录和值首次出现的位置,实现了快速查找最长平衡子串的长度。适用于字符串长度最大为10^6的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
给定只含01的字符串,找出最长平衡子串的长度(平衡串:包含0和1的个数相同),串长最大10^6

输入

 一个字符串,只包含01,长度不超过1000000

输出

 一行一个整数,最长的0与1的个数相等的子串的长度。

 

示例输入

3
1011
1111
1010

示例输出

2
0
4

思路:将0看做-1,求前i项和,当前i项和为0时,以此元素为结尾的最长长度为当前下标值+1;若该和值是第一次出现用hash数组记录该和值第一次出现时的下标i,否则当前下标值与hash数组中记录的当前和值第一次的下标值相减就是以此元素为结尾的最长长度。其中的最长的长度便是所要求的解。

实现代码:

#include<bits/stdc++.h>
using namespace std;
char s[1000003];
int h[2000003];
int main()
{
	int t,i,j;
	int m=1000001;//作为和值偏移值 防止出现负数无法用hash数组保存
	scanf("%d",&t);
	while(t--)
	{
	
		memset(h,-1,sizeof(h));
		scanf("%s",&s);
		int n=0,ma=0;
		for(i=0;i<strlen(s);i++)
		{
			if(s[i]=='0')n--;
			else n++;
			
			if(n==0)ma=max(ma,i+1);
			else if(h[n+m]==-1)h[n+m]=i;
			else {
				ma=max(ma,i-h[n+m]);	
			}
		}
		printf("%d\n",ma);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值