给定一个字符串,逐个翻转字符串中的每个单词。
示例 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; } };