一个01字符串,求出现0、1出现次数相等的最长子串

来源:互联网 发布:如何看待网络暴力演讲 编辑:程序博客网 时间:2024/06/09 20:54

题目描述:

     已知一个长度为N的字符串,只由0和1组成, 求一个最长的子串,要求该子串出0和1出现的次数相等。

     要求算法时间复杂度尽可能的低。

     比如:  1000010111000001,加粗的部分10


思路:

(1) 最简单的想法就是遍历所有的子串,之后判断该子串是否满足条件

     N^2子串,每个子串扫一遍判断0、1是否出现的次数相等,复杂度为O(N^3)

     稍加思考就会发现, 如果一个长度为n的子串满足条件,加么这n个元素的和 加起来一定=(n/2) 

     这样在循环的过程中,增量加就可以了,不需要每个子串从头计算,复杂度降为O(N^2);

     

int maxlen = 0, sum = 0, currlen = 0;
for(int i = 0; i < N; ++i)
{
    sum = 0;
    for(int j = i; j < N; ++j)
    {
        currlen = j - i + 1;
        sum += int(A[j]);
        if(currlen%2 == 0 && sum == currlen/2 && currlen > maxlen)
            maxlen = currlen;
    }
}

 (2) 还有没有办法进一步降低算法的复杂度呢?

    遇到0:-1               遇到1:+1      sum:-n~n      提升N,  0~2n

     个数相等,则前缀和为0。对前缀和进行排序,最大减去最小

      哈希代替排序,





0 0
原创粉丝点击