【编程题】最长01子串

本篇博文主要想讲一讲一道编程题,该题是我面试网易游戏时,初始的面试官提出的。

题目:编写一个算法,给定一个只包含0和1的字符串,输出其中0和1的个数相同的最长子串的长度。

例如:

输入:
1011010

输出:
6

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# coding=utf-8

class Solution(object):
def get_length_of_longest_01_substring(self, string):
# 特殊输入的检查
if string == '' or string == None or len(string) == 1:
return 0

# 计算状态列表sum
sum = [0] * len(string)
sum[0] = -1 if int(string[0]) == 0 else 1
for i in range(1, len(string)):
num = int(string[i])
if num == 0:
sum[i] = sum[i - 1] - 1
else:
sum[i] = sum[i - 1] + num

# 计算字典:sum_value->(min_index, max_index)
s_dict = {}
for i, e in enumerate(sum):
if e not in s_dict.keys():
s_dict[e] = [i, i]
else:
s_dict[e][1] = max(s_dict[e][1], i)

# 计算子串最长长度
max_len = 0
for i, e in enumerate(sum):
if e == 0:
max_len = max(max_len, i + 1)
for k, v in s_dict.items():
max_len = max(max_len, v[1] - v[0])

return max_len

# 测试
print(Solution().get_length_of_longest_01_substring('1011010')) # 6
print(Solution().get_length_of_longest_01_substring('')) # 0
print(Solution().get_length_of_longest_01_substring('0')) # 0
print(Solution().get_length_of_longest_01_substring('1')) # 0
print(Solution().get_length_of_longest_01_substring('000000')) # 0
print(Solution().get_length_of_longest_01_substring('111111')) # 0
print(Solution().get_length_of_longest_01_substring('000111')) # 6