先说一句,折在这道题太久了,呜呜每天做题不要断开,要不然就想一直拖,呜呜呜
思路以及注意
比较前后字符串,1.删空格2.reverse3.单词reverse
注意:s.resize(n)中n是数组长度,这里为什么可以用j呢,因为s【j】=s[i]之后,j++,即j现在至少是s.size()
reverse()翻转字符串
C++ reverse()函数用法详解(深入了解,一文学会)-CSDN博客
vector/string: reverse(s.begin(), s.end());
数组: reverse(s, s + N - 1);
数组中删除元素
O(n):erase
STL中erase()的用法 - Excaliburer - 博客园 (cnblogs.com)
O(1):快慢指针
困难:
删除空格,除了中间可能多空格,还有首尾多空格,特别是尾的多空格
处理办法:先不管尾的空格,最后把尾删到没有空格为止
class Solution {
public:
string reverseWords(string &s,int start,int end){
reverse(s.begin()+start,s.begin()+end);
return s;
}
//
string reverseWords(string s) {
//1.删除空格
int j = 0;
for(int i = 0;i<s.size();i++){
if(i == 0){
if(s[i] == ' '){//末尾两个空格?
continue;
}else{
s[j++] = s[i];
continue;
}
}
if(s[i] == s[i-1] && s[i] == ' '){
continue;
}else{
s[j++] = s[i];
}
}
while(s[j-1]==' '){
j--;
}
//2.reverse
s.resize(j);
reverse(s.begin(),s.end());
//3.swap
int start = 0;
int end = 0;
while(end <= s.size()){//考虑到末尾的情况
if(end == s.size() || s[end] == ' ' ){
reverseWords(s,start,end);
start = end+1;
end++;
}else{
end++;
}
}
return s;
}
};
关于删空格,
代码随想录思路也挺好的,不关注空格,只关注单词,在单词之间(slow!=0)加入空格
// 版本二
void removeExtraSpaces(string& s) {//去除所有空格并在相邻单词之间添加空格, 快慢指针。
int slow = 0; //整体思想参考https://programmercarl.com/0027.移除元素.html
for (int i = 0; i < s.size(); ++i) { //
if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。
if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。
while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。
s[slow++] = s[i++];
}
}
}
s.resize(slow); //slow的大小即为去除多余空格后的大小。
}