1. 解题思路
这一题我没有什么很好的思路,最后是看了答案之后给出了一个最暴力的解法,即分别考察一个字符的情况下能够构成的最长的balanced string的长度,只有两个字符的情况下能够构成的最长的balanced string的长度,以及三个字符的情况下能够构成的最长的balanced string的长度。
2. 代码实现
给出python代码实现如下:
class Solution:
def longestBalanced(self, s: str) -> int:
n = len(s)
chars = set(s)
def longest_balanced_1(s):
ans = 0
prev, cnt = "", 0
for ch in s:
if ch == prev:
cnt += 1
else:
prev, cnt = ch, 1
ans = max(ans, cnt)
return ans
def longest_balanced_2(s, a, b):
ans = 0
cache = defaultdict(list)
diff = 0
cache[diff].append(0)
for i, ch in enumerate(s):
if ch == a:
diff += 1
elif ch == b:
diff -= 1
else:
ans = max(ans, max(loc[-1]-loc[0] for loc in cache.values()))
cache = defaultdict(list)
diff = 0
cache[diff].append(i+1)
continue
cache[diff].append(i+1)
return max(ans, max(loc[-1]-loc[0] for loc in cache.values()))
def longest_balanced_3(s):
cache = defaultdict(list)
diff_ab, diff_ac = 0, 0
cache[(diff_ab,diff_ac)].append(0)
for i, ch in enumerate(s):
if ch == 'a':
diff_ab += 1
diff_ac += 1
elif ch == "b":
diff_ab -= 1
else:
diff_ac -= 1
cache[(diff_ab,diff_ac)].append(i+1)
return max(loc[-1]-loc[0] for loc in cache.values())
if len(chars) == 1:
return n
elif len(chars) == 2:
a, b = list(chars)
return max(longest_balanced_2(s, a, b), longest_balanced_1(s))
else:
return max(longest_balanced_3(s), longest_balanced_2(s, "a", "b"), longest_balanced_2(s, "a", "c"), longest_balanced_2(s, "b", "c"), longest_balanced_1(s))
提交代码评测得到:耗时1669ms,占用内存48.55MB。
LeetCode 3714 最长平衡子串II
1877

被折叠的 条评论
为什么被折叠?



