1. 解题思路
这一题思路上就是拆成两部分,首先就是考察当前所有的LCT字符串的个数,然后就是考察插入一个字符之后能够额外获取的LCT的最大个数是多少,两者相加即为我们最终的答案。
然后,首先关于原始LCT字符串的个数,我们只需要考察每一个字符C出现的位置前后各有多少个L与T即可。
其次,关于如何考察插入任意字符之后能够获取的最大LCT字符串的增量,我们只需要分别考察在每一个位置上插入L, C, T三个字符之后的结果即可,而这三种方式带来的增量分别为:
- 后续
CT字符串的个数 - 前后
L与T的字符个数的乘积 - 前方
LC字符串的个数
其中,一三两种结果可以通过累积数组进行获取,而第二种情况则直接前后根据第一步当中预先得到的结果计算即可。
2. 代码实现
给出python代码实现如下:
class Solution:
def numOfSubsequences(self, s: str) -> int:
n = len(s)
cnt_T = [0 if ch != "T" else 1 for ch in s]
cnt_CT = [0 for _ in s]
for i in range(n-2, -1, -1):
cnt_T[i] += cnt_T[i+1]
if s[i] == "C":
cnt_CT[i] = cnt_T[i+1] + cnt_CT[i+1]
else:
cnt_CT[i] = cnt_CT[i+1]
cnt_L = [0 if ch != "L" else 1 for ch in s]
cnt_LC = [0 for _ in s]
for i in range(1, n):
cnt_L[i] += cnt_L[i-1]
if s[i] == "C":
cnt_LC[i] = cnt_L[i-1] + cnt_LC[i-1]
else:
cnt_LC[i] = cnt_LC[i-1]
ans, inc = 0, 0
for i in range(n):
if s[i] == "C":
ans += cnt_L[i] * cnt_T[i]
inc = max(inc, cnt_CT[i], cnt_LC[i], cnt_L[i] * cnt_T[i])
return ans + inc
提交代码评测得到:耗时687ms,占用内存29.62MB。
3万+

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



