2025-11-27:为视频标题生成标签。用go语言,给定一个字符串 caption(视频标题),按下面顺序处理并输出一个标签: 1. 将标题中的各个词合并成一

2025-11-27:为视频标题生成标签。用go语言,给定一个字符串 caption(视频标题),按下面顺序处理并输出一个标签:

  1. 将标题中的各个词合并成一个单一的驼峰形式词串:第一个词全部小写,之后每个词首字母大写,其余字母小写;在最前面加上字符 '#'.

  2. 除了开头的 '#',把所有非英文字母的字符都去掉,只保留 A--Z 和 a--z。

  3. 如果生成的字符串超过 100 个字符,从右侧截断,使长度不超过 100。

  4. 按上述流程对 caption 处理后,返回最终得到的标签。

1 <= caption.length <= 150。

caption 仅由英文字母和 ' ' 组成。

输入: caption = "Leetcode daily streak achieved"。

输出: "#leetcodeDailyStreakAchieved"。

解释:

除了 "leetcode" 以外的所有单词的首字母需要大写。

题目来自力扣3582。

处理步骤详解

  1. 转换为全小写

    首先,将输入字符串 caption 全部转换为小写字母。这一步旨在统一大小写,为后续的标题格式转换做准备。例如,"Leetcode daily streak achieved" 会被转换为 "leetcode daily streak achieved"。转换通过 strings.ToLower 实现,它会遍历字符串中的每个字符并将其小写化。

  2. 应用标题格式转换

    接着,使用 Go 的 cases.Title 转换器(针对英语配置)将字符串转换为标题格式。标题格式的定义是:每个单词的首字母大写,其余字母保持小写。例如,"leetcode daily streak achieved" 会被转换为 "Leetcode Daily Streak Achieved"。这一步骤确保了单词边界的正确识别,与标准的标题格式化逻辑一致。

  3. 移除空格并形成驼峰形式

    在标题格式转换后,移除字符串中的所有空格,使单词连接在一起,形成连续的字符串。例如,"Leetcode Daily Streak Achieved" 在移除空格后变为 "LeetcodeDailyStreakAchieved"。此时,字符串已具备驼峰形式的雏形,但第一个单词的首字母仍是大写的。

  4. 添加 # 并调整首单词为全小写

    在驼峰形式字符串的开头添加 # 字符。然后,将 # 后的第一个字符(即原第一个单词的首字母)转换为小写,以确保第一个单词全部小写,而后续单词保持首字母大写。例如,"LeetcodeDailyStreakAchieved" 添加 # 后变为 "#LeetcodeDailyStreakAchieved",接着将首字母 L 小写化为 l,最终得到 "#leetcodeDailyStreakAchieved"。这一步通过字符串拼接和 unicode.ToLower 实现。

  5. 过滤非英文字母字符

    根据题目要求,需保留除 # 外的英文字母(A-Z、a-z)。但由于输入字符串 caption 仅包含英文字母和空格,且空格已在步骤3中被移除,因此无需额外过滤操作。这一约束条件自动满足了要求。

  6. 长度检查与截断

    检查字符串长度(包括 #)。如果长度超过100个字符,则保留前100个字符,截断右侧多余部分。例如,若结果字符串为120字符,则截取前100字符。这一步通过切片操作实现,确保输出符合长度限制。

时间复杂度和空间复杂度分析

  • 总时间复杂度:整个过程涉及多次线性操作:

    • 大小写转换(ToLowerTitle 转换器)各需遍历字符串一次,时间复杂度为 O(n)。
    • 空格移除(ReplaceAll)需遍历并构建新字符串,时间复杂度为 O(n)。
    • 添加 # 和调整首字母涉及字符串拼接和切片,最坏情况下需复制字符串,时间复杂度为 O(n)。
    • 长度截断是 O(1) 操作(仅调整切片长度)。
      因此,总时间复杂度为 O(n) ,其中 n 是输入字符串 caption 的长度。
  • 总额外空间复杂度

    由于 Go 中字符串不可变,每个操作(如大小写转换、空格移除、拼接)都可能创建新字符串副本。最坏情况下,中间结果会占用 O(n) 的额外空间。例如,ToLowerTitle 转换各产生一个新字符串,ReplaceAll 和拼接操作也会分配新内存。因此,总额外空间复杂度为 O(n)

说明

  • 整个过程严格依赖输入约束(仅英文字母和空格),无需处理非字母字符。
  • 示例输出 "#leetcodeDailyStreakAchieved" 符合题目要求:首单词全小写,后续单词首字母大写,且以 # 开头。

Go完整代码如下:

go 复制代码
package main

import (
	"fmt"
	"strings"
	"unicode"

	"golang.org/x/text/cases"
	"golang.org/x/text/language"
)

func generateTag(caption string) string {
	s := strings.ToLower(caption)
	// s = strings.Title(s) // 所有单词首字母大写
	// 创建一个指定语言的 Title Caser
	caser := cases.Title(language.English)
	// 对字符串进行转换
	s = caser.String(s)
	s = strings.ReplaceAll(s, " ", "")
	if s == "" {
		return "#"
	}
	s = "#" + string(unicode.ToLower(rune(s[0]))) + s[1:]
	if len(s) >= 100 {
		s = s[:100]
	}
	return s
}

func main() {
	caption := "Leetcode daily streak achieved"
	result := generateTag(caption)
	fmt.Println(result)
}

Python完整代码如下:

python 复制代码
# -*-coding:utf-8-*-

import string

def generate_tag(caption):
    s = caption.lower()
    
    # 使用 Python 的 title() 方法进行标题转换
    # 注意:Python 的 title() 与 Go 的 cases.Title 行为略有不同
    s = s.title()
    
    s = s.replace(" ", "")
    
    if not s:
        return "#"
    
    # 将第一个字符转换为小写,并在前面添加 #
    s = "#" + s[0].lower() + s[1:]
    
    # 如果长度超过100,截断
    if len(s) >= 100:
        s = s[:100]
    
    return s

def main():
    caption = "Leetcode daily streak achieved"
    result = generate_tag(caption)
    print(result)

if __name__ == "__main__":
    main()

C++完整代码如下:

cpp 复制代码
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
#include <sstream>

std::string toLowerCase(const std::string &str) {
    std::string result = str;
    std::transform(result.begin(), result.end(), result.begin(),
                   [](unsigned char c){ return std::tolower(c); });
    return result;
}

// Title Case:每个单词首字母大写
std::string toTitleCase(const std::string &str) {
    std::stringstream ss(str);
    std::string word, result;
    while (ss >> word) {
        if (!word.empty()) {
            word[0] = std::toupper(static_cast<unsigned char>(word[0]));
            if (word.size() > 1) {
                std::transform(word.begin() + 1, word.end(), word.begin() + 1,
                               [](unsigned char c){ return std::tolower(c); });
            }
            result += word + " ";
        }
    }
    if (!result.empty()) {
        result.pop_back(); // 去掉最后一个空格
    }
    return result;
}

std::string generateTag(const std::string &caption) {
    std::string s = toLowerCase(caption);       // 全部转小写
    s = toTitleCase(s);                         // 每个单词首字母大写
    s.erase(std::remove(s.begin(), s.end(), ' '), s.end()); // 删除空格

    if (s.empty()) {
        return "#";
    }

    // 第一个字母小写
    s[0] = static_cast<char>(std::tolower(static_cast<unsigned char>(s[0])));

    // 加上 #
    s = "#" + s;

    // 长度限制为100
    if (s.size() > 100) {
        s = s.substr(0, 100);
    }
    return s;
}

int main() {
    std::string caption = "Leetcode daily streak achieved";
    std::string result = generateTag(caption);
    std::cout << result << std::endl;
    return 0;
}
相关推荐
zhengzizhe2 小时前
LangGraph4j LangChain4j JAVA 多Agent编排详解
java·后端
程序员鱼皮2 小时前
又被 Cursor 烧了 1 万块,我麻了。。。
前端·后端·ai·程序员·大模型·编程
程序员爱钓鱼2 小时前
Go语言 OCR 常用识别库与实战指南
后端·go·trae
tonydf2 小时前
动态表单之后:如何构建一个PDF 打印引擎?
后端
allbs2 小时前
spring boot项目excel导出功能封装——4.导入
spring boot·后端·excel
用户69371750013842 小时前
11.Kotlin 类:继承控制的关键 ——final 与 open 修饰符
android·后端·kotlin
用户69371750013842 小时前
10.Kotlin 类:延迟初始化:lateinit 与 by lazy 的对决
android·后端·kotlin
稚辉君.MCA_P8_Java2 小时前
通义 Go 语言实现的插入排序(Insertion Sort)
数据结构·后端·算法·架构·golang
未若君雅裁2 小时前
sa-token前后端分离集成redis与jwt基础案例
后端