Easy

题目描述

给你一个字符串 title,它由一个或多个单词组成,单词之间用单个空格分隔,每个单词由英文字母组成。请你按以下规则将字符串首字母大写:

  • 如果单词的长度为 1 或 2 个字母,需要将所有字母转换为小写。
  • 否则,将首字母转换为大写,其余字母转换为小写。

返回首字母大写后的字符串。

示例 1:

输入:title = "capiTalIze tHe titLe"
输出:"Capitalize The Title"
解释:
由于所有单词的长度都至少为 3,每个单词的首字母大写,其余字母小写。

示例 2:

输入:title = "First leTTeR of EACH Word"
输出:"First Letter of Each Word"
解释:
单词 "of" 长度为 2,所以它是全小写的。
其余单词长度至少为 3,所以每个剩余单词的首字母大写,其余字母小写。

示例 3:

输入:title = "i lOve leetcode"
输出:"i Love Leetcode"
解释:
单词 "i" 长度为 1,所以它是小写的。
其余单词长度至少为 3,所以每个剩余单词的首字母大写,其余字母小写。

提示:

  • 1 <= title.length <= 100
  • title 由若干用单个空格分隔的单词组成,且不含前导或尾随空格
  • 每个单词由大小写英文字母组成,且非空

解题思路

这是一个字符串处理题,需要根据单词长度进行不同的大小写转换。

解题思路:

  1. 分割单词:将字符串按空格分割成单词数组
  2. 逐个处理:对每个单词根据长度规则进行处理:
    • 长度 ≤ 2:全部转为小写
    • 长度 > 2:首字母大写,其余小写
  3. 重新拼接:将处理后的单词用空格重新连接

实现方法:

  • 方法一(推荐):使用内置的分割函数,简洁明了
  • 方法二:手动遍历字符串,逐字符处理,空间复杂度更优

两种方法时间复杂度相同,但方法一代码更简洁易懂,是面试中的优选方案。

关键细节:

  • 注意单词长度的判断条件(≤2 还是 >2)
  • 字符大小写转换的实现
  • 最终结果的拼接方式

代码实现

class Solution {
public:
    string capitalizeTitle(string title) {
        stringstream ss(title);
        string word;
        string result;
        
        while (ss >> word) {
            if (!result.empty()) {
                result += " ";
            }
            
            if (word.length() <= 2) {
                for (char& c : word) {
                    c = tolower(c);
                }
            } else {
                word[0] = toupper(word[0]);
                for (int i = 1; i < word.length(); i++) {
                    word[i] = tolower(word[i]);
                }
            }
            
            result += word;
        }
        
        return result;
    }
};
class Solution:
    def capitalizeTitle(self, title: str) -> str:
        words = title.split()
        result = []
        
        for word in words:
            if len(word) <= 2:
                result.append(word.lower())
            else:
                result.append(word[0].upper() + word[1:].lower())
        
        return ' '.join(result)
public class Solution {
    public string CapitalizeTitle(string title) {
        string[] words = title.Split(' ');
        
        for (int i = 0; i < words.Length; i++) {
            if (words[i].Length <= 2) {
                words[i] = words[i].ToLower();
            } else {
                words[i] = char.ToUpper(words[i][0]) + words[i].Substring(1).ToLower();
            }
        }
        
        return string.Join(" ", words);
    }
}
var capitalizeTitle = function(title) {
    return title.split(' ').map(word => {
        if (word.length <= 2) {
            return word.toLowerCase();
        } else {
            return word[0].toUpperCase() + word.slice(1).toLowerCase();
        }
    }).join(' ');
};

复杂度分析

复杂度类型大小说明
时间复杂度O(n)n 是字符串长度,需要遍历每个字符一次
空间复杂度O(n)需要额外空间存储分割后的单词和结果字符串

相关题目