翻转字符串里的单词
翻转字符串里的单词
题目:
给定一个字符串,逐个翻转字符串中的每个单词。
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
你可以按 任意顺序 返回答案 。
示例 1:
- 输入:” the sky is blue “
- 输出:”blue is sky the”
示例 2:
- 输入:” hello world! “
- 输出:”world! hello”
示例 3:
- 输入: “a good example”
- 输出: “example good a”

解法-双指针法
思路:以" the sky is blue "
为例
- 移除多余空格
"the sky is blue"
- 反转整个字符串
"eulb si yks eht"
- 将每个单词反转
"blue is sky the"
复杂度:
代码:
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 57 58 59 60 61 62
| class Solution { public: void reverse(string& s,int start,int end) { int slow = start,fast = end; while(slow < fast) { swap(s[slow++],s[fast--]); } } void removeExtraSpaces(string& s) { int slow = 0,fast = 0; while(s[fast] == ' ') { fast++; } for(;fast < s.size();fast++) { if(s[fast] == ' ' && s[fast-1] == s[fast]) { continue; }else{ s[slow]=s[fast]; slow++; } } if(s[slow-1] == ' ') { s.resize(slow-1); }else{ s.resize(slow); } } string reverseWords(string s) { removeExtraSpaces(s); reverse(s,0,s.size()-1); int begin = 0; for(int i = 0;i<s.size();++i) { if(s[i] == ' ') { reverse(s,begin,i-1); begin = i+1; } } reverse(s,begin,s.size()-1); return s; }
};
|
语法小计
- 该题没语法小计
*