0015重新排列句子中的单词

该博客介绍了一道LeetCode周赛题目——重新排列句子中的单词。首先将句子按空格拆分成单词,然后对单词进行稳定排序,保持相同长度单词的原顺序。代码实现中使用了Python的split()函数和内置排序,最后调整首字母大小写。时间复杂度为O(nlogn),空间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重新排列句子中的单词

编号:0015

题目来源:leetcode189周赛

题目描述

句子是一个用空格分隔单词的字符串。给你一个满足下述格式的句子text

  • 句子的首字母大写
  • text中的每个单词都用单个空格分隔

请重新排列text中的单词,使所有单词按其长度的升序排列。如果两个单词的长度相同,则保留其在原句子中的相对顺序。

请同样按上述格式返回新的句子。

解答算法

算法思路

首先题目给的是一个string类型的变量,我们要把其按照空格进行拆分。

按照空格拆分的方法有两种:

一种是暴力遍历

for (int i = 0; i < text.size(); i++)
        {
            if (text[i] != ' ') //非空格压入temp中
                temp.push_back(text[i]);
            else
            {
                word.push_back(temp);  //把temp存入word中
                sort.push_back(make_pair(temp.size(), word.size() - 1));
                temp.clear();
            }
        }

另一种方法是利用stringstream,我们知道>>运算符输入的时候,会把空白符作为分隔符

while (ss >> temp) {   //这里的ss就是stringstream
            words.push_back(temp);
        }

然后注意要把第一个单词的首字母由大写转为小写。

然后对其进行稳定排序,这里用到了标准库中的函数stable_sort,保证排序前后相同的量,顺序不变

stable_sort(words.begin(), words.end(), [](const string& a, const string& b) {
            return a.size() < b.size();
        });

然后将其逐个添加在result函数的末尾即可,注意最后要将result的首字母大写。

代码实现

代码传送门

    string arrangeWords(string text) {
        vector<string> words;
        stringstream ss(text);
        string temp;
        while (ss >> temp) {
            words.push_back(temp);
        }
        if (!words.empty()) {
            words[0][0] = tolower(words[0][0]);
        }

        stable_sort(words.begin(), words.end(), [](const string& a, const string& b) {
            return a.size() < b.size();
        });

        string ans = "";
        for (auto& s : words) {
            ans += s;
            ans += " ";
        }
        if (!ans.empty()) {
            ans[0] = toupper(ans[0]);
        }
        ans.pop_back();
        return ans;
    }

复杂度分析

  • 时间复杂度:整个过程中,进行了遍历时间复杂度为 O ( n ) O(n) O(n),稳定排序时间复杂度为 O ( n l g n ) O(nlgn) O(nlgn),因此总的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度:过程中使用了word存储每一个单词,因此空间复杂度为 O ( n ) O(n) O(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值