美文网首页
最长01相等子串

最长01相等子串

作者: 牛奶芝麻 | 来源:发表于2018-03-16 15:07 被阅读243次

给一个只由0和1组成的字符串,找一个最长的子串,要求这个子串里面0和1的数目相等。

解题思路:

这样一种巧妙的解法:定义一个数据 B[N], B[i] 表示 A[0...i] 中 num_of_0 - num_of_1,即 0 的个数与1 的个数的差。 那么如果 arr[i] ~ arr[j] 是符合条件的子串,一定有 B[i] = B[j],因为中间的部分 0、1 个数相等,相减等于0。 只需要扫一遍 A[N] 就能把 B[N] 构造出来了。

时间复杂度:O(n),空间复杂度:O(n)

Python 实现:
class Solution:
    """
    @param s: 0、1子串
    @return: 最长 0、1相等子串的长度
    """
    def lengest01SubStr(self, s):
        count = [0, 0]
        B = [0] * len(s)
        dic = {}  # 保存0、1的差值
        lengest = 0
        for i in range(len(s)):
            count[int(s[i])] += 1
            B[i] = count[0] - count[1] # 0、1 出现的差值
            if B[i] == 0:  # 从字符串开始,0、1出现的次数相等
                lengest = i + 1
                continue
            # 字典中有,说明字典保存的下标到当前下标这一段,出现0与1的个数相等
            if B[i] in dic:
                lengest = max(lengest, i - dic[B[i]]) # 更新最长子串
            else:
                dic[B[i]] = i
        return lengest

a = '1011010'
b = '10110100'
print(Solution().lengest01SubStr(a)) # 6 # '011010'
print(Solution().lengest01SubStr(b)) # 8 # '10110100'

相关文章

  • 最长01相等子串

    给一个只由0和1组成的字符串,找一个最长的子串,要求这个子串里面0和1的数目相等。 解题思路: 这样一种巧妙的解法...

  • 字符串算法

    最长公共前缀 最长回文串 最长回文子序列 最长公共子串 反转单词顺序列 反转字符串 字符串转数字 IP-int互转

  • Manacher算法

    最长回文子串问题# 给定一个字符串,找出最长的回文子串,如"waabwswbfd",则最长子串为bwsb. 中心试...

  • 最长公共子序列和最长公共子串

    最长公共子序列和最长公共子串区别 最长公共子串(Longest CommonSubstring)和最长公共子序列(...

  • 最长不重复子串

    1. 问题定义 最长不重复子串:一个字符串中最长的没有重复字符的子串。举个? : abcabcbb 最长子串 a...

  • 最长公共 / 对称字串

    求最长对称字串是求最长公共子串的变形.. (๑˘ ˘๑) 最长公共子串 Longest Common Subseq...

  • 最长回文子串

    最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...

  • 阿里面试算法题四

    最长不含有重复串的字符串 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1...

  • iOS面试题汇总---算法类

    字符串 【3】最长回文子串 【3】最长无重复子串 【1*】字符串转数字 【4】KMP 算法 【2】字符串全排列 【...

  • 最长回文子序列

    该问题区别于最长回文子串,子串必须是连续的,而子序列则可以跳跃,例如AABCAA的最长回文子串为AA,但是它的最长...

网友评论

      本文标题:最长01相等子串

      本文链接:https://www.haomeiwen.com/subject/fzjhqftx.html