C++ 中反转字符串中的单词


假设我们有一个包含一些单词的字符串。我们需要反转字符串中的单词位置。所以如果字符串像“The quick brown fox jumps over a lazy dog”

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

  • 定义一个函数 getString(),它将 s 作为输入,它将按以下方式工作:

  • i := 0,j := s 的大小 – 1

  • 当 s[i] = ' ' 且 i < s 的大小,将 i 增加 1

  • 当 j >= 0 且 s[j] = ' ',将 j 减少 1

  • ret := 空字符串

  • 对于 i <= j,将 i 增加 1

    • 如果 ret 的大小不为零,并且 ret 的最后一个元素是 ' ' 且 s[i] 是 ' ',则进入下一个迭代

    • ret := ret + s[i]

  • 定义另一个名为 reverseWords() 的方法,它将 s 作为输入

  • j := 0

  • 对于 I 在 0 到 s 的大小 – 1 的范围内,在每一步设置 i := j

    • 如果 s[i] 是空格,则 j := i + 1

    • 否则

      • 当 j + 1 < s 的大小且 s[j + 1] 不是空格,则将 j 增加 1

      • x := i 且 y := j

      • 当 x < y

        • 交换 s[x] 和 s[y],将 x 增加 1 并将 y 减少 1

      • 将 j 增加 1

  • 从主方法中,执行以下操作:

  • 反转字符串 s

  • reverseWords(s)

  • 返回 getString(s)

示例(C++)

让我们看看下面的实现来更好地理解:

 在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   string reverseWords(string s) {
      reverse(s.begin(), s.end());
      reverseWordss(s);
      return getString(s);
   }
   string getString(string s){
      int i = 0;
      int j = s.size() - 1;
      while(s[i] == ' ' && i < s.size()) i++;
      while(j >= 0 && s[j] == ' ') j--;
      string ret = "";
      for(;i <= j; i++){
         if(ret.size() && ret.back() == ' ' && s[i] == ' ')continue;
         ret += s[i];
      }
      return ret;
   }
   void reverseWordss(string& s){
      int j = 0;
      for(int i = 0; i < s.size() ;i = j){
         if(s[i] == ' '){
            j = i + 1;
         }
         else{
            while(j + 1 < s.size() && s[j + 1] != ' ') j++;
            int x = i;
            int y = j;
            while(x < y){
               swap(s[x], s[y]);
               x++;
               y--;
            }
            j++;
         }
      }  
   }
};
main(){
   Solution ob;
   cout << (ob.reverseWords("The quick brown fox jumps over a lazy dog"));
}

输入

"The quick brown fox jumps over a lazy dog"

输出

"dog lazy a over jumps fox brown quick The"

更新于: 2020-04-29

6K+ 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告