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完整代碼如下:

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完整代碼如下:

# -*-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++完整代碼如下:

#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;
}

在這裏插入圖片描述