字符串拼接最大长度 - 避免出现 'AAA' 或 'BBB' 子字符串
思路:贪心
首先考虑能否把所有的 'AB' 字符串都用上。因为 'AB' 既不是 'AA' 也不是 'BB',所以使用 'AB' 不会使得出现 'AAA' 或者 'BBB'。因此,我们可以先把所有的 'AB' 都使用上,剩下的 'AA' 和 'BB' 再考虑怎么使用。
接下来考虑如何使用 'AA' 和 'BB'。如果我们一直使用一种字符串,那么很容易出现 'AAA' 或者 'BBB'。因此,我们需要交替使用 'AA' 和 'BB',直到其中一种字符串用完为止。在使用 'AA' 和 'BB' 的过程中,我们需要保证使用后字符串中不会出现 'AAA' 或者 'BBB'。具体而言,我们可以记录当前字符串中最后两个字符,如果当前要使用的字符串与最后两个字符相同,则跳过该字符串,否则将该字符串加入新字符串中。
最后需要注意的是,如果 'AA' 和 'BB' 的数量相等,那么最后剩下的那个字符串无论是 'AA' 还是 'BB' 都不能直接加入新字符串中,否则就会出现 'AAA' 或者 'BBB'。因此,最后需要判断一下是否有剩下的 'AA' 或者 'BB',并选择其中一个加入新字符串中。
时间复杂度:$O(x+y+z)$
Python3 代码:
class Solution:
def maximumLength(self, x: int, y: int, z: int) -> int:
res = z # 使用所有 'AB' 字符串
lastTwo = ''
while x > 0 and y > 0: # 交替使用 'AA' 和 'BB'
if lastTwo == 'AA': # 避免出现 'AAA'
y -= 1
lastTwo = 'BB'
res += 2
elif lastTwo == 'BB': # 避免出现 'BBB'
x -= 1
lastTwo = 'AA'
res += 2
else: # 第一次使用 'AA' 或 'BB'
if x >= y: # 选择数量较多的字符串
x -= 1
lastTwo = 'AA'
res += 2
else:
y -= 1
lastTwo = 'BB'
res += 2
if x > 0 and lastTwo != 'AA': # 剩余 'AA' 且最后两个字符不为 'AA'
res += 2
elif y > 0 and lastTwo != 'BB': # 剩余 'BB' 且最后两个字符不为 'BB'
res += 2
return res
原文地址: http://www.cveoy.top/t/topic/oTfn 著作权归作者所有。请勿转载和采集!