死磕两次调用reverse的解法
各种小bug层出不穷
class Solution {
// 去除首尾空格
void Trim(string & s)
{
string blanks("\f\v\r\t\n ");
s.erase(0, s.find_first_not_of(blanks));
s.erase(s.find_last_not_of(blanks) + 1);
}
// 删除内部多余空格
string reverseN(string s){
string ans; // 新的字符串
int cnt1 = 0;
for(int k = s.size() - 1; k >= 0; k--){
if(s[k] == ' '){
cnt1++;
if(cnt1 == 1){
ans += ' ';
}
continue;
}
cnt1 = 0;
ans += s[k];
}
return ans;
}
public:
string reverseWords(string s) {
// // 两次翻转 解法
Trim(s);
// // 去除字符串中多余的空格
// reverse(s.begin(), s.end());
string s1 = reverseN(s);
// cout<< s1;
int i = 0, cnt = 0;
int start = 0, endn = 0;
for(auto c : s1){
// 判断是否有多余字符串
if(cnt == 0 && c == ' '){
endn = i;
reverse(s1.begin() , s1.begin() + endn);
cnt++;
}
if(c == ' '){
start = endn + 1;
endn = i;
reverse(s1.begin() + start, s1.begin() + endn);
}
i++;
}
if(endn == 0)
reverse(s1.begin() + endn, s1.end()); // 针对仅有一个词的情况,需要从0开始
else
reverse(s1.begin() + endn + 1, s1.end()); // 针对 最后一个单词的情况
return s1;
}
};