政府网站建设教程/怎样推广自己的商城
力扣链接:151. 翻转字符串里的单词
这一种解法里包含了多个子函数,可以说,这一题里面包含了好几个题目。这种解法思路清晰,容易理解,所以记录下来。(思路来源于程序员Carl)
C语言版:
void swap(char* a, char* b)
{char tmp = *a;*a = *b;*b = tmp;
}
char* reverse(char* s, unsigned int start, unsigned int end)
{int i = start;int j = end;if (start >= end){return s;}for (; i < j; i++, j--){swap(&s[i], &s[j]);}return s;
}char* removeExtraSpaces(char* s)
{int i = 1;int len = 0;int origin_len = strlen(s);if (s[0] != ' '){s[len++] = s[0];}while (i < origin_len){if (s[i] == ' ' && s[i - 1] == ' '){}else{s[len++] = s[i];}i++;}if (s[len - 1] == ' '){s[len - 1] = '\0';}else{s[len] = '\0';}return s;
}char* reverseWords(char* s)
{int len;int left;int right;removeExtraSpaces(s);len = strlen(s);reverse(s, 0, len - 1);for (left = 0, right = 1; right <= len; right++){if (s[right] == ' ' || right == len){reverse(s, left, right - 1);left = right + 1;}}return s;
}
C++版:
class Solution {
public:string reverse(string& s, int start, int end){if (start >= end){return s;}for (int i = start, j = end; i < j; i++, j--){swap(s[i], s[j]);}return s;}string removeExtraSpaces(string& s){unsigned int i = 1;while (i < s.size()){if (s[i] == ' ' && s[i - 1] == ' '){s.erase(s.begin() + i);}else{i++;}}if (s[0] == ' '){s.erase(s.begin());}if (s[s.size() - 1] == ' '){s.erase(s.end());}return s;}string reverseWords(string s) {removeExtraSpaces(s);reverse(s, 0, s.size() - 1);for (unsigned int left = 0, right = 1; right <= s.size(); right++){if (s[right] == ' ' || right == s.size()){reverse (s, left, right - 1);left = right + 1;}}return s;}
};