题目
Leetcode Reverse Words in a String
思路
1. 做过几道正序处理字符串的题目, 这些题目的特点是状态比较多, 假如都写在 mian 函数里可能导致思路混乱. 所以总结了一下解决此类题目的框架
2.
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 |
void ( int ) gotoFlow1() { ... } void
( int ) gotoFlow2() { ... } int i; for (i = 0; i < s.size(); i ++) { if (s[i] == xxxx) { // condition 1 gotoFlow1(); continue ; } if (i >= s.size()) break ; if (s[i] == uuuu) { // condition 2 gotoFlow2(); continue ; } } |
3. 这个框架外层用 while 函数, 只判断, 不对 i 进行自增操作. 而 gotoFlow 内部则使用 for 循环, 减少代码行数. gotoFlow 函数可以返回值也可以返回 void. 另外, 为了使思路更加顺畅, 最好不要在原始的字符串上操作.
代码一 Reverse Words in a String
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 |
#include <iostream> #include <algorithm> using
namespace std; string gotoSpace( int
&i, const
string &s) { while (i < s.size() && s[i] == ‘ ‘ ) i ++; return
" " ; } string gotoWord( int
&i, const
string &s) { string cps; int
st = i; while (i < s.size() && s[i] != ‘ ‘ ) { i ++; } cps = s.substr(st, i-st); reverse(cps.begin(), cps.end()); return
cps; } class
Solution { public : void
reverseWords(string &s) { int
i = 0; while (i < s.size() && s[i] == ‘ ‘ ) i ++; s = s.substr(i); i = s.size() - 1; while (i >= 0 && s[i] == ‘ ‘ ) i --; s = s.substr(0, i+1); string cps; i = 0; while (i < s.size()) { if (s[i] == ‘ ‘ ) { cps.append(gotoSpace(i, s)); } if ( i >= s.size()) break ; if (s[i] != ‘ ‘ ) { cps.append(gotoWord(i, s)); } } reverse(cps.begin(), cps.end()); s = cps; } }; |
原文:http://www.cnblogs.com/zhouzhuo/p/3617879.html