151. Reverse Words in a String

题目:

Given an input string, reverse the string word by word.

For example,
Given s = "the sky is blue",
return "blue is sky the".

Update (2015-02-12):
For C programmers: Try to solve it in-place in O(1) space.


题意:

给定输入一个字符串,将字符串中的单词一个接一个的反转输出。使用C程序:试着在O(1)空间复杂度中完成。

说明:

1、单词构成?每个单词由不包含空白字符的字母字符序列组成;

2、输入字符串是否开始跟结尾是否有空白字符?有,反转过后的字符串不应该再包含开始跟结尾的空白字符;

3、两个单词中是否存在多个空白字符?反转输出字符串中,两个单词中只需要单个字符串;


思路一:

将整个给定的字符串逆序翻转,之后对每个字符进行轮训,如果不为空,则开始组拼字符为逆序的单词序列,之后将这部分逆序的单词序列翻转为正常单词状态,之后重复以上步骤,最后删除掉空白空间。

代码:12ms

class Solution {
public:
    void reverseWords(string &s) {
        reverse(s.begin(), s.end());
        int storeIndex = 0;  //有效字符存储索引下标
        for (int i=0; i<s.size(); i++) {  
            if (s[i] != ' ') {  //存在字母字符时
                if (storeIndex != 0)  //第一个单词前不加空白字符,以后每两个单词之间加空白字符
                    s[storeIndex++] = ' ';
                int j = i;  
                while (j<s.size() && s[j] != ' ') { //拿到一个完整单词序列
                    s[storeIndex++] = s[j++]; //组拼字符为逆序单词序列
                }
                reverse(s.begin() + storeIndex - (j-i), s.begin() + storeIndex); //翻转逆序单词序列为正常单词
                i = j; //将此时下标i更新到轮训中
            }
        }
        s.erase(s.begin() + storeIndex, s.end()); //删掉有效字符串之后的空白空间。
    }
};

思路二:

利用正则表达式,将给定的字符串由一个或者多个空白字符串作为分隔条件分割为多个单词字符串数组,之后从后往前依次组拼字符串即可。

代码:57ms

public class Solution {
    public String reverseWords(String s) {
        String[] parts = s.trim().split("\\s+"); //利用正则表达式切割给定字符串
        String res = "";
        for (int i=parts.length-1; i>0; i--) { //组拼返回字符串
            res += parts[i] + " ";
        }
        return res + parts[0];
    }
}

思路三:

轮训整个给定字符串,先减掉字符串前面的空白字符,然后找到每个单词,将每个单词翻转,完成整个字符串轮训之后,将整个字符串再翻转一遍,即可完成单词翻转。思路三与思路一类似,只是先后顺序不一样。

代码:10ms

class Solution {
public:
    void reverseWords(string &s) {
        int i = 0, j = 0;
        int l = 0;
        int len = s.length();
        int wordcount = 0;
        
        while (true) {
            while (i<len && s[i] == ' ') i++;  //去掉给定字符串前面的空白
            if (i == len) break;  //到达字符串末尾,则返回
            if (wordcount) s[j++] = ' ';  //单词刚开始不加空白字符、之后每两个单词之间用单个空白字符隔开
            l = j; //记录下单词开始位置
            while (i<len && s[i] != ' ') { //存储单词
                s[j++] = s[i++];
            }
            reverseword(s, l, j-1);  //将单个单词翻转
            wordcount++;
        }
        
        s.resize(j);
        reverseword(s, 0, j-1);  //将结果字符串整个翻转
    }
    
    void reverseword(string &s, int i, int j) {  //翻转给定字符串s的i到j部分
        while (i < j) {
            char t = s[i];
            s[i++] = s[j];
            s[j--] = t;
        }
    }
};

思路四:

利用空格做分隔,连续的不为空部分为单词,将寻找到的单词依次组拼到字符串前面即可,需要使用库函数。

代码:13ms

class Solution {
public:
    void reverseWords(string &s) {
        
        string res;
        int pos = 0;
        for (int i=0; i<s.size(); i++) {
            if (s[i] == ' ') {  //找到两个单词之间的分隔空白字符
                if (i > pos)
                    res = s.substr(pos, i-pos) + " " + res;
                pos = i + 1; //用来跳过刚开始连续的空白,以及单词之间多个空白
            } else if (i == s.size() - 1)
                res = s.substr(pos, s.size()-pos) + " " + res; //组拼最后一个单词
        }
        s = res.substr(0, res.size() - 1);
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值