151. 翻转字符串里的单词(字符串 双指针法)(Leetcode刷题笔记)
https://lunan0320.cn
文章目录
题目
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。
解题代码 C++ (双指针法)
class Solution {
public:
//在闭区间上将字符串逆序
void reverse_substr(string& s, int begin, int end){
while(end > begin){
swap(s[begin],s[end]);
begin++;
end--;
}
}
//去除多余空格
void removeSpace(string& s){
int slow = 0;
int fast = 0;
//去除前面的空格
while(fast < s.size() && s[fast] == ' '){
fast++;
}
//去除中间的空格
while (fast < s.size()){
if(fast > 1 && s[fast-1] == ' ' && s[fast] == s[fast-1]){
fast++;
continue;
}
s[slow++] = s[fast++];
}
//去除末尾的空格
if(s[slow-1]==' ') {
s.resize(slow-1);
}else s.resize(slow);
}
string reverseWords(string s) {
//先去除多余的空格
removeSpace(s);
//将整个字符串逆序
reverse_substr(s,0,s.size()-1);
int begin = 0;
int end = 0;
bool word = false;
//每个单词翻转一次
for(int i = 0; i < s.size(); i++){
//布尔遍历word决定当前字母是否在单词内,确定起始点
if(!word){
begin = i;
word = true;
}
//中间以空格分隔每个单词,依次翻转
if(s[i]==' '){
reverse_substr(s, begin, i-1);
word = false;
}
//末尾最后一个单词,翻转
if(i == s.size()-1){
reverse_substr(s, begin, i);
}
}
return s;
}
};