class Solution {
public:
void reverseString(vector<char>& s) {
for(int i=0,j=s.size()-1;i<j;i++,j--){
char tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
return;
}
};
class Solution {
public:
//使用reverse库函数
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k){
if(i+k<=s.size()){
reverse(s.begin()+i,s.begin()+i+k);
}
else reverse(s.begin()+i,s.end());
}
return s;
}
};
class Solution {
public:
//不用reverse库函数
string reverseStr(string s, int k) {
for(int i=0;i<s.size();i+=2*k){
if(i+k<=s.size()){
for(int l=i,j=i+k-1;l<j;l++,j--){
swap(s[l],s[j]);
}
//reverse(s.begin()+i,s.begin()+i+k);
}
else {
for(int l=i,j=s.size()-1;l<j;l++,j--) swap(s[l],s[j]);
}
//reverse(s.begin()+i,s.end());
}
return s;
}
};
54. 替换数字(第八期模拟笔试)
#include <iostream>
using namespace std;
int main() {
string s;
cin>>s;
//扩充字符串大小
//从后往前填充
int count=0;
int len=s.size();
for(int i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9')count+=1;
}
s.resize(s.size()+5*count);
for(int i=len-1,j=s.size()-1;i>=0;i--){
if(s[i]>='0'&&s[i]<='9'){
s[j--]='r';
s[j--]='e';
s[j--]='b';
s[j--]='m';
s[j--]='u';
s[j--]='n';
}
else s[j--]=s[i];
}
cout<<s;
}
class Solution {
public:
//翻转函数
void reverse(string &s,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
swap(s[i],s[j]);
}
}
//去除多余空格
void removeExtraSpaces(string& s){//去除所有空格元素,并在相邻单词之间添加空格,快慢指针
int slow=0;
for(int fast=0;fast<s.size();fast++){
if(s[fast]!=' '){//遇到非空格就处理,即删除所有空格
if(slow!=0) s[slow++]=' ';//手动在相邻单词之间添加空格
while(s[fast]!=' '&&fast<s.size()){
s[slow++]=s[fast++];
}
}
}//通过手动模拟就可以知道遍历到每个新单词都会重新进入line 15,此时line 16就会添加一个单词间空格
s.resize(slow);
}
string reverseWords(string s) {
removeExtraSpaces(s);
reverse(s,0,s.size()-1);
//遍历,反转每个单词
int start=0;
for(int i=0;i<=s.size();i++){
if(i==s.size()||s[i]==' '){
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};
55. 右旋字符串(第八期模拟笔试)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string str;
int k;
int main() {
cin >> k >> str;
reverse(str.begin(),str.end());
reverse(str.begin(),str.begin()+k);
reverse(str.begin()+k,str.end());
cout << str;
}
KMP算法的应用
class Solution {
public:
//前缀表的创建
void getNext(int *next,string s){
int j=0;
next[0]=0;
for(int i=1;i<s.size();i++){
while(j>0&&s[i]!=s[j]){//前后缀不相同了
j=next[j-1];//j向前回退
}
if(s[i]==s[j]){//找到相同的前后缀
j++;
}
next[i]=j;//将j(前缀的长度)赋值给next[i]
}
}
int strStr(string haystack, string needle) {
vector<int> next(needle.size());
getNext(&next[0],needle);
int j=0;
for(int i=0;i<haystack.size();i++){
while(j>0&&haystack[i]!=needle[j]){
j=next[j-1];
}
if(haystack[i]==needle[j]){
j++;
}
if(j==needle.size()){
return (i-needle.size()+1);
}
}
return -1;
}
};
class Solution {
public:
void getNext(int *next,string& s){
//初始化
next[0]=0;
int j=0;
//不匹配
for(int i=1;i<s.size();i++){
while(j>0&&s[j]!=s[i]){
j=next[j-1];
}
//匹配
if(s[i]==s[j]){
j++;
}
//next数组赋值
next[i]=j;
}
}
bool repeatedSubstringPattern(string s) {
int next[s.size()];
getNext(next,s);
int len=s.size();
if(next[len-1]!=0&&len%(len-(next[len-1]))==0){
return true;
}
return false;
}
};