[LeetCode]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.

click to show clarification.

Clarification:
What constitutes a word?
A sequence of non-space characters constitutes a word.
Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces.
How about multiple spaces between two words?
Reduce them to a single space in the reversed string.

思路

两次反转法。这里注意单词之间的多个空格只留一个空格以及去掉前导0和后导0。

代码

/*---------------------------------------
*   日期:2015-05-05
*   作者:SJF0115
*   题目: 151.Reverse Words in a String
*   网址:https://leetcode.com/problems/reverse-words-in-a-string/
*   结果:AC
*   来源:LeetCode
*   博客:
-----------------------------------------*/
#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    void reverseWords(string &s) {
        int size = s.size();
        if(size <= 0){
            return;
        }//if
        // 前导0
        int index = 0;
        while(s[index] == ' '){
            ++index;
        }//while
        int left = index;
        // 后导0
        index = size - 1;
        while(s[index] == ' '){
            --index;
        }//while
        int right = index;
        // 连续空格只保留一个
        for(int i = left;i <= right;){
            if(i > left && s[i-1] == ' ' && s[i] == ' '){
                s.erase(i-1,1);
                --right;
            }//if
            else{
                ++i;
            }
        }//for
        // 翻转
        int start = left,end = left;
        for(int i = left;i <= right+1;++i){
            if(i == right+1 || s[i] == ' '){
                Reverse(s,start,end-1);
                ++end;
                start = end;
            }//if
            else{
                ++end;
            }//else
        }//for
        // 整体翻转
        Reverse(s,left,right);
        s = s.substr(left,right - left + 1);
    }
private:
    void Reverse(string &str,int start,int end){
        for(int i = start,j = end;i < j;++i,--j){
            swap(str[i],str[j]);
        }//for
    }
};

int main() {
    Solution solution;
    //string str("   abc    cd     ef ");
    string str("  a   vvv  ");
    solution.reverseWords(str);
    cout<<str<<endl;
}

运行时间

这里写图片描述

代码二

/*---------------------------------------
*   日期:2015-05-05
*   作者:SJF0115
*   题目: 151.Reverse Words in a String
*   网址:https://leetcode.com/problems/reverse-words-in-a-string/
*   结果:AC
*   来源:LeetCode
*   博客:
-----------------------------------------*/
#include <iostream>
#include <algorithm>
using namespace std;

class Solution {
public:
    void reverseWords(string &s) {
        int size = s.size();
        if(size <= 0){
            return;
        }//if
        int index = size - 1;
        string str;
        while(index >= 0){
            // 空格
            while(index >= 0 && s[index] == ' '){
                --index;
            }//while
            if(index < 0){
                break;
            }//if
            if(str.size() != 0){
                str.push_back(' ');
            }//if
            string tmp;
            while(index >= 0 && s[index] != ' '){
                tmp.push_back(s[index]);
                --index;
            }//while
            // 翻转
            reverse(tmp.begin(),tmp.end());
            str.append(tmp);
        }//while
        s = str;
    }
};

int main() {
    Solution solution;
    string str("   abc    cd     ef ");
    //string str(" a  ");
    solution.reverseWords(str);
    cout<<str<<endl;
}

运行时间

这里写图片描述

目录
相关文章
|
9月前
CF1553B Reverse String(数学思维)
CF1553B Reverse String(数学思维)
25 0
|
19天前
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
45 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
机器学习/深度学习 NoSQL 算法
LeetCode 344. 反转字符串 Reverse String
LeetCode 344. 反转字符串 Reverse String
LeetCode 206. 反转链表 Reverse Linked List
LeetCode 206. 反转链表 Reverse Linked List
|
索引
LeetCode 345. Reverse Vowels of a String
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
54 0
LeetCode 345. Reverse Vowels of a String
|
机器学习/深度学习 NoSQL
LeetCode 344. Reverse String
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
72 0
LeetCode 344. Reverse String
LeetCode 190. Reverse Bits
颠倒给定的 32 位无符号整数的二进制位。
68 0
LeetCode 190. Reverse Bits
LeetCode 150. Evaluate Reverse Polish Notation
根据逆波兰表示法,求表达式的值。 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
29 0
LeetCode 150. Evaluate Reverse Polish Notation
LeetCode 92. Reverse Linked List II
给定一个链表,反转指定的子序列.
60 0
LeetCode 92. Reverse Linked List II
LeetCode之Reverse String II
LeetCode之Reverse String II
86 0