这周三四,和下周都会比较忙,一个不会鸽但博客会比较水
先贴一个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;
}