Leetcode 3628. Maximum Number of Subsequences After One Inserting
- Leetcode 3628. Maximum Number of Subsequences After One Inserting
- 1. 解题思路
- 2. 代码实现
- 题目链接:3628. Maximum Number of Subsequences After One Inserting
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, 0for 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。