题目来源
题目描述
给定一个字符串,逐个翻转字符串中的每个单词。
示例:
输入:[“t”,“h”,“e”," “,“s”,“k”,“y”,” “,“i”,“s”,” “,“b”,“l”,“u”,“e”]
输出:[“b”,“l”,“u”,“e”,” “,“i”,“s”,” “,“s”,“k”,“y”,” ",“t”,“h”,“e”]
注意:
- 单词的定义是不包含空格的一系列字符
- 输入字符串中不会包含前置或尾随的空格
- 单词与单词之间永远是以单个空格隔开的
进阶:使用 O(1) 额外空间复杂度的原地解法。
class Solution {
public:
void reverseWords(vector<char>& str){
}
};
题目解析
思路
- 先把每个单词翻转一遍,再把整个字符串翻转一遍,或者也可以调换个顺序,先翻转整个字符串,再翻转每个单词
class Solution {
static void reverse(vector<char>& str, int left, int right){
while (left < right){
std::swap(str[left], str[right]);
left++; right--;
}
}
public:
void reverseWords(vector<char>& str){
int left = 0, n = str.size();
for (int i = 0; i <= n; ++i) {
if(i == n || str[i] == ' '){
reverse(str, left, i);
left = i + 1;
}
}
reverse(str, 0, n - 1);
}
};
思路
- 也可以使用STL中自带的reverse 函数来做
- 先把整个字符串反转一下
- 然后扫描每个字符串:
- 用两个指针,一个指向开头,另一个开始遍历,遇到空格停止,这样两个指针之间就确定了一个单词的范围
- 再调用reverse反转
- 然后移动头指针到下一个位置,在用另一个指针扫描
class Solution {
public:
void reverseWords(vector<char>& str) {
reverse(str.begin(), str.end());
for (int i = 0, j = 0; i < str.size(); i = j + 1) {
for (j = i; j < str.size(); ++j) {
if (str[j] == ' ') break;
}
reverse(str.begin() + i, str.begin() + j);
}
}
};
类似题目
题目 | 思路 |
---|---|
leetcode:61. 旋转链表,每个节点右移k个位置 Rotate List | 先遍历整个链表获得链表长度n,然后把链表头部和尾部连接起来,在往后走n - k % n个节点就到达新链表的头结点的前一个节点,这时断开链表即可 |
leetcode:189. 旋转数组,每个数组右移k个位置 Rotate Array | 多次反转:先反转全部,然后反转前k个,最后反转剩余的;下标连环怼;使用临时数组 |
leetcode:151. 给定字符串, 反转字符串中的单词 Reverse Words in a String | 源字符串为:"the sky is blue ";移除多余空格:“the sky is blue”;字符串反转:“eulb si yks eht”;单词反转:“blue is sky the” |
leetcode:186. 给定char数组,翻转字符串里的单词 II Reverse Words in a String II | 先把每个单词翻转一遍,再把整个字符串翻转一遍,或者也可以调换个顺序,先翻转整个字符串,再翻转每个单词 |
leetcode:557. 给定字符串, 反转字符串中的单词 III Reverse Words in a String III | 可以用字符流处理类stringstream来做:按顺序读入每个单词进行翻转即可 |