LeetCode 翻转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词。

示例:

输入: "the sky is blue",
输出: "blue is sky the".

说明:

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。
方法一:使用栈的先进后出的特性,将每个单词读入栈,然后依次出栈合并即可。(时间复杂度O(n),额外的空间复杂度O(n))

class Solution {
public:
	void reverseWords(string &s) {
		stack<string> myStrStack;//辅助栈
		int strSize = s.size();//扫描s串,将所有的单词放入栈中
		for (int index = 0; index < strSize; ) {
            //跳过空格
			while (index < strSize && s[index] == ' ') {
				++index;
			}
			if (index >= strSize) {
				break;
			}
            //确定单词的尾部下标
			int endIndex = index;
			while (endIndex < strSize && s[endIndex] != ' ') {
				++endIndex;
			}
            //将这个单词截取出来
			string tempStr = s.substr(index, endIndex - index);
			myStrStack.push(tempStr);//放入栈中
			index = endIndex + 1;
		}
		s = "";//清空s串
        //将栈中的所有的单词按照顺序读出
		if (!myStrStack.empty()) {
			s += myStrStack.top();
			myStrStack.pop();
		}
		while (!myStrStack.empty()) {
			s += " " + myStrStack.top();
			myStrStack.pop();
		}
	}
};

方法二:先将整个字符串翻转,然后翻转单词,再去掉多余的空格。(时间复杂度O(n),额外的空间复杂度O(1))

class Solution {
public:
	void reverseWords(string &s) {
		int strSize = s.size();//扫描s串
		//将字符串全部翻转
		reverse(s.begin(), s.end());
		s.erase(0, s.find_first_not_of(" "));//去除字符串前多余的空格
		s += ' ';
		//然后将中间的单词翻转
		for (int i = 0, x = 0; i < s.size(); ++i) {
			if (s[i] == ' ') {
				reverse(s.begin() + x, s.begin() + i);
				x = i + 1;
				for (int j = i + 1; j < s.size(); ++j) {
					if (s[j] != ' ') {//移除多余空格
						s.erase(i + 1, j - (i + 1));
						break;
					}
				}
			}
		}
		s.erase(s.find_last_not_of(" ") + 1);//去除字符串尾部多余的空格
	}
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/87904322
今日推荐