151. 反转字符串中的单词 - 力扣(LeetCode)
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: “the sky is blue”
输出: “blue is sky the”
示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
要求使用空间复杂度O(1)的解法
很综合的题
基本思路:
移除多余空格
由于字符串成员的地址连续,这里用快慢指针移除空格,但要注意需保留分隔单词的空格
最后重置字符串的大小
1 2 3 4 5 6 7 8 9 10 11 12 13
| void deleteExtraSpaces(string& s) { int slow = 0, fast = 0, len = s.size(); while (fast < len) { if (s[fast] != ' ') { if (slow != 0) s[slow++] = ' '; while (fast < len && s[fast] != ' ') { s[slow++] = s[fast++]; } } fast++; } s.resize(slow); }
|
反转字符
有单独再反转单词的需求,应引入起始下标
1 2 3 4 5
| void reverseString(string& s, int start, int end) { for (int i = start, j = end; i < j; i++, j--) { swap(s[i], s[j]); } }
|
反转单词
快慢指针找出每个单词的起始下标进行翻转
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
| class Solution { public: void reverseString(string& s, int start, int end) { for (int i = start, j = end; i < j; i++, j--) { swap(s[i], s[j]); } } void deleteExtraSpaces(string& s) { int slow = 0, fast = 0, len = s.size(); while (fast < len) { if (s[fast] != ' ') { if (slow != 0) s[slow++] = ' '; while (fast < len && s[fast] != ' ') { s[slow++] = s[fast++]; } } fast++; } s.resize(slow); } string reverseWords(string s) { deleteExtraSpaces(s); int len = s.size(); reverseString(s, 0 , len - 1); int slow = 0, fast = 0; while (fast <= len) { if (s[fast] == ' ' || fast == len) { reverseString(s, slow, fast - 1); fast++; slow = fast; } fast++; } return s; } };
|