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

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

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

示例
分析:本题在翻转字符串之前需要思考的是我们如何除去单词间多余的空格,这里我只采用c++中提供的 istringstream 方法(如不采用此法可使用双指针去除空格),首先将字符串的每个单词取出并另存于字符串变量;
去掉多余空格的之后,我们观察到:整体反转一次就能将颠倒单词顺序,再对每个单词进行内部的反转即可得到目标字符串,放上图解↓
在这里插入图片描述
代码如下:

class Solution {
    
    
public:
	void reverse(string& str, int left, int right) {
    
    //反转字符串
		while (left < right) {
    
    
			swap(str[left++], str[right--]);
		}
	}

	string reverseWords(string& s) {
    
    
		istringstream iss(s);
		string tmp;
		string str;
		while (iss >> tmp) {
    
    
			str += tmp + ' ';
		}
		int len = str.length();
		str.erase(len - 1);//去掉末尾的' '

		int left = 0, right = len - 2;
		reverse(str, left, right);
		str += ' ';//末尾添上空格符作为标记
		right = 0;
		while (left < len) {
    
    
			while (str[right] != ' ' && right < len)
				right++;//出循环之后right停留在' '位置
			reverse(str, left, right - 1);
			left = right++ + 1;
            
		}
		str.erase(len - 1);//除去末尾的 ' '
		return str;
	}
};

猜你喜欢

转载自blog.csdn.net/Genius_bin/article/details/113777129