diff --git a/solutions/151. Reverse Words in a String.md b/solutions/151. Reverse Words in a String.md new file mode 100644 index 0000000..4da8161 --- /dev/null +++ b/solutions/151. Reverse Words in a String.md @@ -0,0 +1,56 @@ +# [151. Reverse Words in a String](https://leetcode.com/problems/reverse-words-in-a-string/) +# 思路 +翻转字符串中的单词,题目中给了我们写特别说明,如果单词之间遇到多个空格,只能返回一个,而且首尾不能有单词. + +## 思路一 +我们新建一个初始化为空的结果字符串res, 从后往前遍历字符串s将每个单词不断拼接到res的尾部就可以了. + +## 思路二 +题目还要求对使用C的同学满足O(1)的复杂度, 那我们就只能在s上进行修改了. + +我们先整个字符串整体翻转一次,然后再分别翻转每一个单词,此时就能得到我们需要的结果了。 + +# C++ +## 思路一 +``` C++ +class Solution { +public: + string reverseWords(string s) { + string res = ""; + int low, high = s.size() - 1; + while(high >= 0){ + while(high >= 0 && s[high] == ' ') high--; + if(high < 0) return res; + low = high - 1; + while(low >= 0 && s[low] != ' ') low--; + + if(res != "") res += " "; + res += s.substr(low+1, high - low); + high = low - 1; + } + return res; + } +}; +``` + +## 思路二 +``` C++ +class Solution { +public: + string reverseWords(string s) { + reverse(s.begin(), s.end()); + int len = 0; // 结果字符串的长度 + for(int i = 0; i < s.size(); i++){ + if(s[i] != ' '){ + if(len != 0) s[len++] = ' '; + int j = i; + while(j < s.size() && s[j] != ' ') s[len++] = s[j++]; + reverse(s.begin() + len - (j - i), s.begin() + len); + i = j; + } + } + s.resize(len); // 修改字符串长度 + return s; + } +}; +```