反转字符串中的单词_leetcode151

题目

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

  string reverseWords(string s) {

}

分析

参数:字符串string s(单词之间肯呢个有多个空格)

返回:处理后的字符串string

处理:将字符串中的单词顺序颠倒,且 单词 之间用单个空格连接

思路:

字符串可能包含多余的前导空格和尾随空格,需要先处理掉,再将字符串按空格分割成多个单词。

考虑到多个空格之间也可能有单词,所以使用一个字符串和一个字符串数组配合来分割单词,最终得到一个字符串数组。

一旦我们得到了单词的列表,我们可以简单地反转该列表。

最后,我们将这些单词重新拼接成一个字符串,每个单词之间使用一个空格连接。

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
​
string reverseWords(string s) {
   //去除多余的前导空格
   int start=0;
   int end=s.size()-1;
   while(start<= end&&s[start]==' '){
        start++;
   }
   //去除多余的尾随空格
   if(start<=end&&s[end]==' '){
        end--;
   }
​
   //分割单词
   //创建words用于存储单词
    vector<string>words;
    string word;
    //遍历字符串
    for(int i=start;i<=end;i++){
        //扫到的字符非空格,则加入word
        if(s[i]!=' '){
            word+=s[i];
        }else if (!word.empty()) {
        //扫到的字符非空格,将当前word加入words,并清空
            words.push_back(word);
            word.clear();
        }
    }
    //将最后一个单词加入words
     // 处理最后一个单词
     if (!word.empty()) {
        words.push_back(word);
    }
    //将words中的单词进行翻转。
    reverse(words.begin(),words.end());
    //拼接单词并返回
    string result;
    for(int i=0;i<words.size();i++){
        result+=words[i];
        if(i!=words.size()-1){
            result+=" ";//单词之间加上空格
        }
    }
    return result;
​
}

注意:在编写代码的过程中,一开始我忽略了加入!word.empty()的必要性。

如果字符串 s 中有多个连续的空格,word 会被添加一个空字符串到 words 向量中,从而导致多余的空字符串进入最终结果。

因此我们在对字符串 word 进行操作(比如将其存入 words 向量中)之前,应检查该字符串是否为空。

接下来我们来介绍一下上述代码涉及到的知识点:

1.C++ 中常见的字符串操作函数:

1)word.empty() 检查字符串是否为空。

2)word.clear() 通过 clear(),我们可以清空一个字符串的内容,通常用于重用一个字符串或准备好一个新的值。

2.vector的用法:

1) words.push_back(word) 将元素添加到 vector 容器的末尾。

3.reverse 是 C++ 标准库中的算法函数,用于反转容器中的元素。通过 <algorithm> 来引入。

语法是: reverse( first, last);

first:指向容器第一个元素的迭代器。

last:指向容器最后一个元素的后一个位置的迭代器。

通过 reverse,可以方便地将容器中的元素顺序反转。

在我们的字符串问题中,我们使用它来反转存储单词的 vector,从而改变单词的顺序。

测试

int main() {
    string s = "  the   sky is   blue  ";
    cout << "Reversed string: '" << reverseWords(s) << "'" << endl;
    return 0;
}

结果

### C语言实现LeetCode 151题(反转字符串中的单词) 对于给定的任务,在C语言中解决该问题的一种方法是通过手动处理字符串并利用辅助函数来完成特定操作。下面展示了一种可能的解决方案,其中包含了如何定义必要的功能以及它们是如何协同工作的解释。 #### 完整代码示例 ```c #include <stdio.h> #include <string.h> void trim(char *str) { char *end; while (isspace((unsigned char)*str)) str++; end = str + strlen(str) - 1; while(end > str && isspace((unsigned char)*end)) end--; *(end+1) = '\0'; } void reverseString(char* start, char* end){ while(start<end){ char temp=*start; *start++=*end; *end--=temp; } } char* reverseWords(char* s) { int length=strlen(s); if(length==0)return ""; // Trim leading and trailing spaces trim(s); char *result=(char*)malloc(strlen(s)+2); // Extra space for potential extra space at the end and null terminator result[0]='\0'; char word[50]; // Assuming no single word will exceed this limit int index=0; for(int i=0;i<=length;i++){ if(i==length || s[i]==' '){ if(index>0){ reverseString(word,word+index-1); strcat(result,word); if(i!=length)strcat(result," "); memset(word,'\0',sizeof(word)); index=0; } }else{ word[index++]=s[i]; } } return result; } ``` 此程序首先移除了输入字符串两端多余的空白字符[^1]。接着遍历整个字符串,每当遇到空格或到达字符串结尾时,就调用`reverseString()`函数翻转当前收集到的一个完整的词,并将其追加到最终的结果串后面。为了防止最后多出不必要的空格,在每次添加新词之前会检查当前位置是否为原字符串的实际末端位置[^2]。 注意这里假设单个词语长度不会超过预设的最大值(这里是49),如果存在更长的情况,则需要调整数组大小或者采用动态分配的方式存储临时变量`word`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值