zoukankan      html  css  js  c++  java
  • 01相等的字串。

    给出一个只有01的字符串,请找出最长的的01的数目的相等的字串。。

    这题最暴力的解决方法就是就是先预处理每个区间01的数目,然后枚举起点和重点,时间复杂度是O(N^2)。

    下面我们来介绍一种O(n)时间复杂度的做法。。。

    首先我们可以用一个数组B[i]把串A当中A[0...i]中1和0的差存起来。这样我们能发现符合要求的就是串满足B[i]==B[j].题目要要最最长,然后找到i-j跨度最大的即可。

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    const int N=2000000;
    char s[N];
    int count[2];
    int B[N];
    int num[N];
    int main()
    {
    	while(scanf("%s",s)!=EOF)
    	{
    		int n=strlen(s);
    		int i;
    		count[0]=0;
    		count[1]=0;
    		memset(B,0,sizeof(B));
    		
            memset(num,-1,sizeof(num));
    		int tmp=0,ans=0;
    		for(i=0;i<n;i++)
    		{
    		    if(s[i]=='1')
    				count[1]++;
    			else
    				count[0]++;
    			B[i]=count[1]-count[0];
    			if(num[B[i]+n]==-1&&B[i]!=0)
    				num[B[i]+n]=i;
    			else
    			{
    				tmp=i-num[B[i]+n];
    				if(tmp>ans)
    					ans=tmp;
    			}
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }


     

  • 相关阅读:
    HttpClient
    充值保存
    button 样式
    创建窗口
    第十一次作业
    第十次作业
    第九次作业
    第八次作业
    第七次作业
    第六次作业
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580136.html
Copyright © 2011-2022 走看看