代码随想录算法训练营day8

5 阅读1分钟

字符串较难部分为反转字符串,共需要考虑以下几点难点 1.怎么把语句反转,再把单词反转回来,实时上是通过两次反转,第一次反转时反转整个语句,第二次时反转单词,注意迭代器的移动位置 2.去除空格的算法设计,应当充分考虑快慢指针的位置以及最后末尾还存在尾空格的情况

public:
    string reverseWords(string s) {
        
        //先对s进行翻转
        reverse(s.begin(),s.end());
        //将反转的字符变为正常单词、
        for(int i=0;i<s.size();i++){
            //跳过初始空格,并排除全部为空格的可能
            while(i<s.size()&&s[i]==' ') i++;
            if(i>=s.size()) break;
            //使用j来记录单词的初始位置,并读取完整单词
           int j=i;
            while(i<s.size()&&s[i]!=' ')
            i++;
        
           //反转单词,注意,这里时左闭右开区间
           reverse(s.begin()+j,s.begin()+i);
        }
        //去除多余空格,使用双指针
        int slow=0;
        for(int fast=0;fast<s.size();fast++){
          // 跳过所有连续的空格(只保留第一个空格,或非空格字符)
            if (s[fast] == ' ') {
                // 仅当:不是开头空格 + 前一个字符不是空格 → 保留一个空格
                if (slow > 0 && s[slow-1] != ' ') {
                    s[slow++] = ' ';
                }
            } else {
                // 非空格字符,直接复制
                s[slow++] = s[fast];
            }
        }
        // 步骤4:截断字符串(去除末尾多余的空格)
        if (slow > 0 && s[slow-1] == ' ') {
            slow--; // 末尾有空格,回退一位
        }
        s.resize(slow); // 截断到有效长度
       
        return s;
    }
};