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:

1
2
3
4
5
> > >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. 对逐个单词进行反转操作,即以中间字符作为对称轴对称交换
  3. 对反转后单词进行拼接,还原成一个字符串

其中比较难得是第一项,因为c++并不像Python那样,并没有可以直接调用string的split方法就能将字符串切割成单词的优势。所以就在网上寻找c++的string的切割方法,最后发现其实都是手动切割的。就抄了一个代码比较精简的切割方法。

而且,这道题在提交代码之后出现之后出现了RuntimeError,Google了之后才发现是自己的代码写得有漏洞,没有考虑到vector为空的情况。因为vector.size()返回的是一个无符号整数,一旦size为0,那么再继续-1之后就会溢出,造成错误!所以调用size()再减一的时候一定要判断size是否为0,避免再次出错。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public:
string reverseWords(string s) {
//字符串切割,切割后的单词存在v中
vector<string> v;
//指定空格为分隔符
string c = " ";
std::string::size_type pos1, pos2;
pos2 = s.find(c);
pos1 = 0;
while (std::string::npos != pos2) {
v.push_back(s.substr(pos1, pos2 - pos1));
pos1 = pos2 + c.size();
pos2 = s.find(c, pos1);
}
if (pos1 != s.length())
v.push_back(s.substr(pos1));


string result = "";
//对vector是否为空进行判断,避免出现RuntimeError
if (v.size() == 0)
return result;
//对切分后的逐个单词进行反转,以中间字符为对称轴进行前后交换
char temp;
for (int i = 0; i < v.size(); ++i) {
for (int j = 0; j < v[i].size() / 2; ++j) {
temp = v[i][v[i].size() - j - 1];
v[i][v[i].size() - j - 1] = v[i][j];
v[i][j] = temp;
}
}
//将反转好的逐个单词拼接回字符串
for (int i = 0; i < v.size() - 1; ++i) {
cout << v[i] << endl;
result += v[i] + " ";
}
result += v[v.size() - 1];
return result;
}
};