[LeetCode]557. Reverse Words in a String III(反转字符串 III)

时间:2022-02-15 15:50:18

557. Reverse Words in a String III

Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order.

Example 1:

Input: "Let's take LeetCode contest"
Output: "s'teL ekat edoCteeL tsetnoc"

Note:

  • In the string, each word is separated by single space and there will not be any extra space in the string.
  • 在字符串中,每个单词都以单个空格分隔,字符串中不会有任何额外的空格。

题目大意:

给定一个字符串,需要颠倒一个句子中每个单词中的字符顺序,同时仍保留空格和初始单词顺序。

挺简单的题,只需要将句子中每个单词中的字母颠倒顺序,其他东西保持不变就行。

思路:

  1. 英文句子分割成一个个单词
  2. 将每个单词反转 (以单词中间字母为中心,前后对称位置的字母交换位置)

代码如下:

#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
//思路:
//1.英文句子分割成一个个单词
//2.将每个单词反转 (以单词中间字母为中心,前后对称位置的字母交换位置)
string reverseWords(string s) {
string res = s;//复制英文句子
int left = 0;//记录单词位置的左下标
int right = 0;//记录单词位置的右下标
for(int i=0; i<res.length()+1; i++){//s.length()+1 是为了遍历字符串最后的结束符'\0'
if(res[i]==' ' || res[i]=='\0'){//若s="asd dfg" 则s[3]=' ',s[7]='\0'
left = right;
right = i-1;//空格或结束符的左邻字符下标 即为 目前单词位置的右下标
int L = left;
int R = right;
for(; L<R; ++L,--R){//反转单词
char temp = res[L];
res[L] = s[R];
res[R] = temp;
}
right = i+1;//空格或结束符的右邻字符下标 即为 下个单词位置的左下标
}
}
return res;
}
};
int main()
{
Solution A;
string a;
getline(cin,a);
//cin >> a;//只能输入没有空格的字符串,当输入中含有空格,则只能输出空格之前的字符
cout << A.reverseWords(a) << endl;
return 0;
}

注意:

  1. 输入不能用cin,cin输入不能包含空格,空格和回车键默认为输入结束,用getline
  2. 结束符一定要遍历,不然最后一个单词不会颠倒