重新排列句子中的单词
编号: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)