LeetCode(151)Reverse Words in a String

本文提供了一种有效的方法来反转字符串中的单词顺序,通过去除多余空格并利用标准模板库实现单词的逆序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下:

Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue",
return "blue is sky the".


分析如下:

        很基础的题目,需要考虑各种corner cases,比如下列:

1 "            "

        2"a        "

        3"             a        "

        4"             a"

        5"             a                     b        "

        6"             a b       "

        7"             a  b"

        8"a  b      "

        9"             a  b                c d e f                          g      "

我的代码:

// 20ms过大集合
class Solution {
public:
    void reverseWords(string &s) {
        vector<string> vec;
        int len=(int)s.length();
        if(len==0)
            return;
        int i=0;
        int j=len-1;
        while(i!=len&&s[i]==' ')
            i++;
        while(j!=-1&&s[j]==' ')
            j--;
        int k=i;
        while(i<=j){
            k=i;
            while(s[i]!=' '&&i<=j)
                i++;
            vec.push_back(s.substr(k,i-k));
            while(s[i]==' '&&i<=j)
                i++;
        }
        if(vec.empty()){
            s="";
            return;
        }
        reverse(vec.begin(),vec.begin()+vec.size());
        string m=vec[0];
        for(int i=1;i<vec.size();i++){
            m+=" ";
            m+=vec[i];
        }
        s=m;
    }
};

小结扩展:

(1) 之前有道相关的题目,在这篇文章的“小结扩展1“这里


updated-2014-11-16:

class Solution {
public:
    void reverseWords(string &s) {
        // preprocess 1 去空串
        if (s == "")
            return;
        int i = 0;
        // preprocess 2 去全空白串。"        "
        while(i < s.length() && s[i] == ' ')  
            i++;
        if (i == s.length()) {
            s = "";
            return ;
        }
        // start work
        string word;
        istringstream str_stream(s);
        string res = "";
        while(str_stream >> word) {
            //if (word == "")  continue;  // str_stream>>word会挤掉单词之间的所有的空格符,不管是1个还是N个,这句没有必要
            res = " " + word + res;
        }
        s = res.substr(1);
        return;
    }
};
上面的时间复杂度是 2 * o(n),第1个o(n)预处理,第2个o(n)去真正干活。预处理做的主要事情是如果输入字符串全部都是"     ",则不能走入while循环,否则报错。

暂时没有找到什么办法可以在1 * o(n)的时间完成。

### 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、付费专栏及课程。

余额充值