** 151.翻转字符串里的单词 **
leetcode链接:https://leetcode.cn/problems/reverse-words-in-a-string/
题目描述:给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
核心思路:使用双指针进行去空格,主要需要注意的是空格去除的逻辑。

点击查看代码
class Solution {
public:
    void reverse(string &s,int start,int end){//这里是交换单个单词,不能重置start
        for(;start < end;start++,end--){
            swap(s[start],s[end]);
        }
    }
    string reverseWords(string s) {
        int fast = 0,slow = 0;
        bool need = false;
        for(;fast < s.size();fast++){//使用bool来判断来处理空格更简单
            if(s[fast] != ' '){
                s[slow++] = s[fast];
                need = true;
                continue;
            }
            if(need){
                s[slow++] = ' ';
                need = false;
            }
        }
        if(s[slow-1]==' '){//需考虑最后一位为空格的情况,如果为空格要去掉
            s.resize(slow-1);
        }
        else {s.resize(slow);}

        slow = 0,fast = s.size() - 1;
        while(slow < fast){//交换首尾的单词
            swap(s[slow],s[fast]);
            slow++,fast--;
        }
        slow = 0,fast = 0;
        for(;fast <= s.size();fast++){//遍历每个单词,分别处理每个单独的单词
            if(fast == s.size() || s[fast] == ' '){
                reverse(s,slow,fast-1);
                slow = fast + 1;
            }
        }
        return s;
    }
};
**卡码网:55.右旋转字符串 ** 题目链接:https://kamacoder.com/problempage.php?pid=1065 题目描述:字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。 核心思路:首先反转全部字符,再分别反转局部字符即可实现。
点击查看代码
#include<iostream>
using namespace std;

int main(){
    int n;
    string s;
    cin >> n >>s;
    int len = s.size() - n;
    //反转全部字符串
    int fast = s.size() - 1,slow = 0;
    for(;slow < s.size()/2;slow++,fast--){
        swap(s[slow],s[fast]);
    }
    //反转前n个字符
    slow = 0,fast = n - 1;
    for(;slow < n/2;slow++,fast--){
        swap(s[slow],s[fast]);
    }
    //反转后面的字符
    slow = 0,fast = s.size() - 1;
    for(;slow < len/2;slow++,fast--){
        swap(s[slow + n],s[fast]);
    }
    cout << s <<endl;
}
//kmp算法涉及到的两题后续再尝试