2026-01-02:插入一个字母的最大子序列数。用go语言,给定一个只含大写字母的字符串 s。你可以选择是否在字符串中加入最多

举报
福大大架构师每日一题 发表于 2026/01/02 06:53:14 2026/01/02
【摘要】 2026-01-02:插入一个字母的最大子序列数。用go语言,给定一个只含大写字母的字符串 s。你可以选择是否在字符串中加入最多一个额外的大写字母,插入位置可以放在任意位置(包括开头或结尾)。目标是使结果字符串中能够形成尽可能多的 “LCT” 模式——也就是选出下标 i<j<k,使得对应字符依次为 ‘L’、‘C’、‘T’(等价于从字符串中删去若干字符但保持剩余字符相对顺序后得到 “LCT”)...

2026-01-02:插入一个字母的最大子序列数。用go语言,给定一个只含大写字母的字符串 s。你可以选择是否在字符串中加入最多一个额外的大写字母,插入位置可以放在任意位置(包括开头或结尾)。目标是使结果字符串中能够形成尽可能多的 “LCT” 模式——也就是选出下标 i<j<k,使得对应字符依次为 ‘L’、‘C’、‘T’(等价于从字符串中删去若干字符但保持剩余字符相对顺序后得到 “LCT”)。求在最优的插入选择下,最终能得到的 “LCT” 出现次数的最大值。

1 <= s.length <= 100000。

s 仅由大写英文字母组成。

输入: s = “LMCT”。

输出: 2。

解释:

可以在字符串 s 的开头插入一个 “L”,变为 “LLMCT”,其中包含 2 个子序列,分别位于下标 [0, 3, 4] 和 [1, 3, 4]。

题目来自力扣3628。

算法步骤分析

1. 统计字符’T’的数量

算法首先统计原始字符串中字符’T’的总数,这个值会在后续计算中用于评估某些插入策略的潜力。

2. 遍历字符串并计算关键指标

算法逐个字符遍历字符串,同时维护多个关键计数器:

  • 基础计数器l统计遇到的’L’数量,c统计遇到的’C’数量
  • 组合计数器lc统计已形成的"LC"组合数量,lct统计已形成的"LCT"子序列数量
  • 插入相关计数器ct统计’C’后面’T’的数量组合,lt评估’L’和’T’的搭配潜力

3. 动态更新计数器

对于每个字符的处理:

  • 遇到’L’l计数器增加
  • 遇到’C’lc增加当前已存在的’L’数量(因为每个已存在的’L’都能与这个’C’形成新的"LC"组合),同时c计数器增加
  • 遇到’T’lct增加当前已存在的"LC"组合数量(每个"LC"都能与这个’T’形成完整的"LCT"),ct增加当前已存在的’C’数量,同时减少剩余’T’数量的统计

4. 评估插入策略

算法通过max(ct, lc, lt)来评估三种最优插入策略:

  • 插入’C’ct代表在’C’位置插入后能新增的"LCT"数量
  • 插入’T’lc代表在’T’位置插入后能新增的"LCT"数量
  • 插入’L’lt代表在’L’位置插入后能新增的"LCT"数量

5. 计算结果

最终结果是原始字符串中的"LCT"子序列数量lct加上最优插入策略能带来的最大增量。

复杂度分析

时间复杂度:O(n)

  • 算法只需要单次遍历字符串,每个字符的处理都是常数时间操作
  • 其中n为字符串s的长度

空间复杂度:O(1)

  • 算法只使用了固定数量的整型变量作为计数器,不随输入规模增长而增加额外空间
  • 这些变量的空间占用是常数级别的

Go完整代码如下:

package main

import (
	"fmt"
	"strings"
)

func numOfSubsequences(s string) int64 {
	t := strings.Count(s, "T")
	var l, lc, lct, c, ct, lt int
	for _, b := range s {
		if b == 'L' {
			l++
		} else if b == 'C' {
			lc += l
			c++
		} else if b == 'T' {
			lct += lc
			ct += c
			t--
		}
		lt = max(lt, l*t)
	}
	return int64(lct + max(ct, lc, lt))
}

func main() {
	s := "LMCT"
	result := numOfSubsequences(s)
	fmt.Println(result)
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

def numOfSubsequences(s: str) -> int:
    t = s.count('T')
    l = lc = lct = c = ct = lt = 0
    
    for ch in s:
        if ch == 'L':
            l += 1
        elif ch == 'C':
            lc += l
            c += 1
        elif ch == 'T':
            lct += lc
            ct += c
            t -= 1
        
        lt = max(lt, l * t)
    
    return lct + max(ct, lc, lt)

# 测试代码
if __name__ == "__main__":
    s = "LMCT"
    result = numOfSubsequences(s)
    print(result)

在这里插入图片描述

C++完整代码如下:

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdint>

int64_t numOfSubsequences(const std::string& s) {
    int t = std::count(s.begin(), s.end(), 'T');
    int l = 0, lc = 0, lct = 0, c = 0, ct = 0, lt = 0;

    for (char ch : s) {
        if (ch == 'L') {
            l++;
        } else if (ch == 'C') {
            lc += l;
            c++;
        } else if (ch == 'T') {
            lct += lc;
            ct += c;
            t--;
        }
        lt = std::max(lt, l * t);
    }

    return lct + std::max({ct, lc, lt});
}

int main() {
    std::string s = "LMCT";
    int64_t result = numOfSubsequences(s);
    std::cout << result << std::endl;
    return 0;
}

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。