C++ 中重新排列句子中的单词


假设我们有一个包含不同单词的字符串,该字符串称为句子,并且格式如下:

  • 第一个字母大写。

  • 文本中的每个单词都用单个空格字符分隔。

我们必须重新排列文本中的单词,以便所有单词按其长度的升序排列。如果两个单词长度相同,则按其原始顺序排列。

然后最终根据这些规则返回字符串。

因此,如果输入类似于“I love to code in cpp”,则输出将为“I to in cpp love code”。

为了解决这个问题,我们将遵循以下步骤:

  • 将文本的第一个字符转换为小写。

  • 定义一个数组 x:使用空格将文本拆分后,将所有单词放入其中。

  • 定义一个包含键值对的数组 s。

  • 初始化 i := 0,当 i < x 的大小,更新(i 增加 1),执行:

    • 在 s 的末尾插入 {x[i],i}。

  • 根据长度对数组 s 进行排序,如果长度相同,则使用索引值。

  • ret := 空字符串。

  • 初始化 i := 0,当 i < s 的大小,更新(i 增加 1),执行:

    • ret := ret 连接 s[i] 的第一个元素。

    • 如果 i 不等于 s 的大小,则:

      • ret := ret 连接空格。

  • 将 ret 的第一个字符转换为大写。

  • 返回 ret。

示例

让我们看看以下实现以更好地理解:

实时演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   vector <string> split(string& s, char delimiter){
      vector <string> tokens;
      string token;
      istringstream tokenStream(s);
      while(getline(tokenStream, token, delimiter)){
         tokens.push_back(token);
      }
      return tokens;
   }
   static bool cmp(pair <string, int>& a, pair <string, int>& b){
      if(a.first.size() != b.first.size()) return a.first.size() < b.first.size();
         return a.second < b.second;
   }
   static bool a(string& a, string& b){
      return a.size() < b.size();
   }
   string arrangeWords(string text) {
      text[0] += 'a' - 'A';
      vector<string> x = split(text, ' ');
      vector<pair<string, int> > s;
      for (int i = 0; i < x.size(); i++)
      s.push_back({ x[i], i });
      sort(s.begin(), s.end(), cmp);
      string ret = "";
      for (int i = 0; i < s.size(); i++) {
         ret += s[i].first;
         if (i != s.size() - 1)
            ret += ' ';
      }
      ret[0] += 'A' - 'a';
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.arrangeWords("I love to code in cpp"));
}

输入

"I love to code in cpp"

输出

I to in cpp love code

更新时间: 2020-11-17

694 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告