代码随想录算法训练营第46期 Day9

这周三四,和下周都会比较忙,一个不会鸽但博客会比较水

先贴一个kmp算法模板

void kmp(){
int n=s1.size()-1,m=s2.size()-1;
    // 求ne数组过程,其实就是自己匹配自己的过程
    for (int i = 2, j = 0; i <= m; ++i) {       // ne[1]为0,即如果第一个字母失败了,则只能从头开始了
        while (j && s2[i] != s2[j + 1]) j = ne[j];    // 未匹配,跳ne
        if (s2[i] == s2[j + 1]) j ++;     // 匹配成功看下一位
        ne[i] = j;      // 表示下标以i-j为起点,i为终点的后缀和下标以0为起点,j为终点的前缀相等
    }
    
    // kmp匹配过程,每次是p[j+1]与s[i]进行匹配
    for (int i = 1, j = 0; i<= n; ++i) {
        while (j && s1[i] != s2[j + 1]) j = ne[j];    // j没有退回起点,失配跳ne[j]
        if (s1[i] == s2[j + 1]) j++;      // 可以匹配,则j后移一位
        if (j == m) {                   // 匹配成功,长度就是m
            cout << i - m+1 <<endl;
            // 匹配成功,即j已经走到了头,下一次匹配的时候,j往后移动的位置就是,j=ne[j]更新下j的位置就行了
            j = ne[j];  
        }
    }


} 

接下来就是两个字符反转

双指针边做边删空格

class Solution {
public:
    string reverseWords(string s) {
        s = ' ' + s;//注意这里要添一个空格的操作,以添加最后一段
        int n = s.size();
        int left = n - 1, right = n;//设置双指针
        string ans;
        while( left >=0) {
            if (s[left] == ' ') {
                if (left + 1 < right) {//配合right=left消除空格
                    ans += s.substr(left + 1, right - left - 1);
                    ans += ' ';
                }
                right = left;
            }
            left--;
        }
        return ans.substr(0, ans.size() - 1);
        
    }
};

先写入大概,再删除空格

class Solution {
public:
    string reverseWords(string s) {
        s=' '+s;
int l=s.size()-1,r=s.size()-1;
string s1;

while(l){
    while(s[l]==' '&&l){
    l--;
}
    int sum=0;
while(s[l]!=' '&&l){
    l--;
    sum++;
}

s1=s1+s.substr(l,sum+1);


}
        // 删除字符串最前面的空格
    if(s1.size() >= 0 && s1[0] == ' ') {
        s1.erase(s1.begin());
    }
    // 删除字符串最后面的空格
    if(s1.size() >=0 && s1[s1.size() - 1] == ' ') {
        s1.erase(s1.begin() + s1.size() - 1);
    }
   
return s1;
    }
};

#include<bits/stdc++.h>
using namespace std;
int main(){
    
    string s1;
    int n;
char s2[10010];
    cin>>n;
    cin>>s1;
    for(int i=0;i<s1.size();i++){
        int locate=(i+n)%(s1.size());
        s2[locate]=s1[i];
    }
    cout<<s2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值