> 文章列表 > 剑指 Offer 58 - I. 翻转单词顺序 / LeetCode 151. 反转字符串中的单词(双指针字符串处理 / 栈)

剑指 Offer 58 - I. 翻转单词顺序 / LeetCode 151. 反转字符串中的单词(双指针字符串处理 / 栈)

剑指 Offer 58 - I. 翻转单词顺序 / LeetCode 151. 反转字符串中的单词(双指针字符串处理 / 栈)

题目:

链接:剑指 Offer 58 - I. 翻转单词顺序;LeetCode 151. 反转字符串中的单词
难度:简单

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

示例 1:

输入: “the sky is blue”
输出: “blue is sky the”

示例 2:

输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:

输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

  • 无空格字符构成一个单词。
  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

方法一:

双指针:

双指针从原字符串尾部向前遍历,右指针留在尾部,左指针向前移动,遇到空格就根据左右指针的距离判断是不是一个单词,如果是就切割出这个单词并加入新字符串中。

代码一:

class Solution {
public:string reverseWords(string s) {string ans;int len = s.size();int i = len -1, j = len - 1;while(i >= 0) {if(s[i] == ' ') {if(i == j) {i--;j--;}else {ans += s.substr(i + 1, j - i);ans += ' ';i--;j = i;}}else i--;}if(i != j) ans += s.substr(0, j - i);if(ans != "" && ans[ans.size() - 1] == ' ') ans.erase(ans.size() - 1, 1);return ans;}
};

时间复杂度O(N),空间复杂度O(N)。