题目
- 给你一个只由字母’a’和’b’组成的字符串s,找一个最长的子串,要求这个子串里面’a’和’b’的数目相等,输出该子串的长度。这个子串可以为空。
s的长度n满足 2<=n<=1000000。
# 暴力解法
class Solution:
def get_len(string):
str_len = len(string)
for i in range((str_len//2)*2, 0, -2):
countA, countB = 0, 0
for j in range(str_len+1-i):
str_sub = s[j, i]
for k in range(len(str_sub)):
if str_sub[k] == 'a':
countA += 1
if str_sub[k] == 'b':
countB += 1
if countA == countB:
return len(str_len)
# 优化法
class Solution:
def get_len(string):
str_len = len(string)
numA, numB = [0]*(str_len+1), [0]*(str_len+1)
a, b = 0, 0
for i in range(str_len):
if string[i] == 'a':
a += 1
if string[i] == 'b':
b += 1
# 判断当前子串中a或b的数量
numA[i+1] = a
numB[i+1] = b
if a == 0 and b == 0:
return 0
res = a if a > b else b
# i与j两个循环,能保证时间复杂度为O(n)
for i in range(2*res, 0, -2):
for j in range(i, str_len+1):
if numA[j] - numA[j-res] == numB[j] - numB[j-res]:
return res