这题真的蛮麻烦的
犯了几个错误
1.关于如何判断两个字串的相对位置 (粘贴的位置)
最开始写成了这样:if(s.find(c)+c.size()==s.find(d))
但这样不满足:aabcdef 中找a b
因为s.find(“a”)的位置始终为0 也就是永远找不到a和b挨着的情况
应当改为
string m=c+d;//c d为两个字串
int p=s.find(m);
if(p!=-1) `
...
特别注意一点 只有当s.find()为int类型时 其返回值才为-1
其他情况下是一个很大的值
所以要单独拿一个int p来存以下s.find();
2.犯的第二个错就是insert的插入位置应当为
t=s.find(m)+c.size();
开始时写成了s.find(d);
当字符串为 baabcdef 时 s.find(d)的位置就变成了0 而不是3
3.第三个注意点就是要特判当字符串中找不到插入位置时,需要粘贴到末尾,所以应当将t初始化为一个不可能的下标来特判一下 比如-1(不特判这种情况还会出现
segmentation fault
/运行时错误
),下标出现-1,编译不通过
4.注意下标从1开始,以及erase insert substr 几个常用字符串函数的用法
以下为我的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
string s;
cin>>s;
int n;
cin>>n;
while(n--){
int a,b;
string c,d;
cin>>a>>b>>c>>d;
//剪切 (下标从1开始)
string k=s.substr(a-1,b-a+1);//字符串c为剪切下来的字符串
s.erase(a-1,b-a+1);//从a开始删除b-a+1个元素
//粘贴
// cout<<"剪切后s="<<s<<endl;
int t=-1;
string m=c+d;
// cout<<"m="<<m<<endl;
int p=s.find(m);
if(p!=-1){// 如果c在d前面 记录t为d开始的下标 即需要插入的位置
// cout<<"##"<<endl;
t=s.find(m)+c.size();
}
// cout<<"t="<<t<<endl;
// cout<<"s="<<s<<endl;
if(t!=-1) s.insert(t,k);
else s=s+k;
// exit(0);
}
cout<<s<<endl;
return 0;
}
突然发现自己一个月前写过这道题:
好简略啊…还真是越学越退化了(啊啊啊
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
string init;
cin>>init;
int n;
cin>>n;
while(n--){
int a,b;
cin>>a>>b;
string x=init.substr(a-1,b-a+1);
init.erase(init.begin()+a-1,init.begin()+b);
string be,ed;
cin>>be>>ed;
int length=be.size();
be+=ed;
int s=init.find(be);
if(s!=-1) init.insert(s+length,x);
else init.insert(init.size(),x);
x.clear();
}
cout<<init<<endl;
return 0;
}