重新排列句子中的单词
2020-07-15 本文已影响0人
WAI_f
题目:
「句子」是一个用空格分隔单词的字符串。给你一个满足下述格式的句子 text :
- 句子的首字母大写
- text 中的每个单词都用单个空格分隔。
请你重新排列 text 中的单词,使所有单词按其长度的升序排列。如果两个单词的长度相同,则保留其在原句子中的相对顺序。
示例:
输入:text = "Leetcode is cool"
输出:"Is cool leetcode"
解释:句子中共有 3 个单词,长度为 8 的 "Leetcode" ,长度为 2 的 "is" 以及长度为 4 的 "cool" 。
输出需要按单词的长度升序排列,新句子中的第一个单词首字母需要大写。
解题方法:
解题思路:
- 将字符串首字母转成小写;
- 分割字符串,并存进vector中,pair包括两部分:分割出来的单词以及单词在原始句子中的编号;
- 对vector进行排序,需要针对pair编写专门的排序规则,重点也是难点;
- 合并排序后的字符串;
- 调整新句子首字母大写。
大致思路就是这些,这种字符串题目做起来不是很难,起码是有思路的,但是坑多,写起来很不舒服。
代码和结果:
class Solution {
public:
static bool cmp(pair<string,int> a, pair<string,int> b)
{
if(a.first.size()==b.first.size())
return a.second<b.second;
else
return a.first.size()<b.first.size();
}
string arrangeWords(string text) {
vector<pair<string,int>> strs;
string s="";
int idx=0;
text[0]=text[0]+'z'-'Z';
for(int i=0;i<text.size();i++)
{
if(text[i]!=' ')
{
s.push_back(text[i]);
}
else
{
strs.push_back(make_pair(s,idx));
s="";
idx++;
}
}
strs.push_back(make_pair(s,idx));
sort(strs.begin(),strs.end(),cmp);
string res="";
for(int i=0;i<strs.size();i++)
{
res+=strs[i].first+" ";
}
if(res[0]<='z'&&res[0]>='a')
res[0]+='Z'-'z';
return res.substr(0,res.size()-1);
}
};
运行结果:

原题链接:https://leetcode-cn.com/problems/rearrange-words-in-a-sentence/