题目:
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入:“the sky is blue”
输出:“blue is sky the”
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
解答:
因为是翻转输出,就类似于先输入的最后输出,概括为先入后出,符合这个特点的就会联想到栈这个数据结构。利用栈的特点,实现起来就简单了很多。具体实现如下:
#include <iostream>
#include <stack>
#include <string>
using namespace std;
class Solution {
public:
string reverseWords(string s) {
stack <string> str; //定义一个栈
string s0 = ""; //用于动态存放s中的每个单词
if (s.empty()) { //字符串为空直接返回
s = "";
return s;
}
for (int i = 0; i < s.length(); i++) {
if (s[i] != 32) { //根据空格划分
s0 += s[i]; //切分完整一个单词
continue;
}
else if (!s0.empty()) { //如果s0非空
str.push(s0); //入栈
s0.clear();//及时清空
}
}
//由于最后一个单词后没有空格,所以退出循环时,可能出现s中最后一个单词放入s0中,但该字符没有入栈的可能
if (!s0.empty()) { //循环退出后,判断当前s0是否为空
str.push(s0); //非空则入栈
s0.clear(); //及时清空
}
while (!str.empty()) { //如果栈不空
s0 += str.top(); //栈顶元素赋值给s0
str.pop(); //出栈
s0 += " "; //在单词之间加入空格
}
//这种情况为当s为多个空格时的情况
if(s0.empty()) //如果在循环判断以后,字符串还是空的
{
s = ""; //则s返回空
return s;
}
s0.erase(s0.end() - 1); //去掉单词最后一个空格
s = s0;
return s;
}
};