题目链接:557. 反转字符串中的单词 III
题目:
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = “Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”
示例 2:
输入: s = “God Ding”
输出:“doG gniD”
提示:
- 1 <= s.length <= 5 * 104
- s 包含可打印的 ASCII 字符。
- s 不包含任何开头或结尾空格。
- s 里 至少 有一个词。
- s 中的所有单词都用一个空格隔开。
思路和算法:
在本题中虽然题目很简短,但是关键信息基本都在提示信息里,所以要特别关注一下提示信息。
思路很简单:找到每个单词的起始位置和结束位置,然后反转每个单词。
代码(c++):
//原地反转
class Solution {
public:
string reverseWords(string s) {
int i = 0;
while (i < s.length()) {
int start = i; //记录字符的起始位置
while (i < s.length() && s[i] != ' ') {
i++; //目的是为了找到单词结束位置
}
reverse(&s[start], &s[i]); //反转单词
//提示中提到s里的所有单词都用一个空格隔开
//所以可以直接i++,否则需要用while
i++; //目的是找到下一个单词的开始位置
}
return s;
}
};
- 时间复杂度:O(N),N表示字符串的长度。字符串中的每个字符要么在 O(1) 的时间内被交换到相应的位置,要么因为是空格而保持不动;
- 空间复杂度:O(1)。