http://noi.openjudge.cn/——3.9数据结构之C++STL——【3342:字符串操作】

题目

3342:字符串操作

查看提交统计提问

总时间限制: 1000ms 内存限制: 65536kB

描述

给定n个字符串(从1开始编号),每个字符串中的字符位置从0开始编号,长度为1-500,现有如下若干操作:

copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串。

add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。

find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

insert S N X:在第N个字符串的第X个字符位置中插入S字符串。

reset S N:将第N个字符串变为S。

print N:打印输出第N个字符串。

printall:打印输出所有字符串。

over:结束操作。

其中N,X,L可由find与rfind操作表达式构成,S,S1,S2可由copy与add操作表达式构成。

输入

第一行为一个整数n(n在1-20之间)

接下来n行为n个字符串,字符串不包含空格及操作命令等。

接下来若干行为一系列操作,直到over结束。

输出

根据操作提示输出对应字符串。

样例输入

3

329strjvc

Opadfk48

Ifjoqwoqejr

insert copy 1 find 2 1 2 2 2

print 2

reset add copy 1 find 3 1 3 copy 2 find 2 2 2 3

print 3

insert a 3 2

printall

over

样例输出

Op29adfk48

358

329strjvc

Op29adfk48

35a8

ac代码

#include <bits/stdc++.h>

using namespace std;

int m;//字符串数

string s[21];//字符串

int tod(string s){//转换成整数

int sd=0;

for(int i=0;i<s.length();i++)

sd=sd*10+(s[i]-'0');

return sd;

}

string tos(int d){//转换成字符串

string s="";

while(d){

s=char(d%10+'0')+s;

d/=10;

}

return s;

}

bool ok(string s){//判断是否5位内的数

if(s.length()>5)return 0;

for(int i=0;i<s.length();i++)

if(s[i]<'0'||s[i]>'9')return 0;

return 1;

}

string go(){//递归函数,输入操作符,用递归进一步输入参数

string sx;

cin>>sx;//cout<<endl<<sx<<":\t";

//copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串。

if(sx=="copy"){//返回字符串

int n=tod(go()),x=tod(go()),l=tod(go());//这些变量定义为局部变量,否则有故障,没进一步探测

return s[n].substr(x,l); }

//add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。

else if(sx=="add"){//返回字符串

string s1=go(),s2=go();

if(ok(s1)&&ok(s2))return tos(tod(s1)+tod(s2));

else return s1+s2;}

//find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

else if(sx=="find"){

string s1=go();int n=tod(go());

if(s[n].find(s1)= =string::npos)return tos(s1.length());//没找到,返回长度

else return tos(s[n].find(s1));}//找到就返回位置

//rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。

else if(sx=="rfind"){

string s1=go();int n=tod(go());

if(s[n].rfind(s1)= =string::npos) return tos(s1.length());

else return tos(s[n].rfind(s1));}

//insert S N X:在第N个字符串的第X个字符位置中插入S字符串。

else if(sx=="insert"){

string s1=go();int n=tod(go()),x=tod(go());

s[n].insert(x,s1);//插入操作

}

//reset S N:将第N个字符串变为S。

else if(sx=="reset"){

string s1=go();int n=tod(go());

s[n]=s1;}

//print N:打印输出第N个字符串。

else if(sx=="print"){

cout<<s[tod(go())]<<endl;

return "";}//string go()该子程序是函数,要求返回字符串

//printall:打印输出所有字符串。

else if(sx=="printall"){

for(int i=1;i<=m;i++)cout<<s[i]<<endl;

}

else return sx;

return "";//如果某分支没有返回,这里统一return。函数不返回是规则错误

}

int main(){

//freopen("data.cpp","r",stdin);

cin>>m;

for(int i=1;i<=m;i++)cin>>s[i];

while(go()!="over");

return 0;

}

小结

  1. 线索多,有些头大,还是要有耐心、信心。
  2. 运行函数,是操作符就分支,再递归输入相应的参数。
  3. 整体上要返回字符串。如add、copy、find、rfind
  4. reset、insert、print、printall不用返回,但是该函数需要返回。
  5. 不是以上操作就返回参数
  6. 递归函数不能全局变量,最好各分支独立设立局部变量。
相关推荐
是那盏灯塔几秒前
【算法】——动态规划之01背包问题
数据结构·c++·算法·动态规划
jinmo_C++35 分钟前
数据结构_深入理解堆(大根堆 小根堆)与优先队列:从理论到手撕实现
java·数据结构·算法
迷失的walker1 小时前
【Qt C++ QSerialPort】QSerialPort fQSerialPortInfo::availablePorts() 执行报错问题解决方案
数据库·c++·qt
Excuse_lighttime1 小时前
排序数组(快速排序算法)
java·数据结构·算法·leetcode·eclipse·排序算法
南方的狮子先生2 小时前
【数据结构】(C++数据结构)查找算法与排序算法详解
数据结构·c++·学习·算法·排序算法·1024程序员节
紫荆鱼3 小时前
设计模式-适配器模式(Adapter)
c++·设计模式·适配器模式
学编程就要猛3 小时前
数据结构初阶:Java中的ArrayList
java·开发语言·数据结构
试试勇气3 小时前
算法工具箱之双指针
数据结构
在等晚安么3 小时前
力扣面试经典150题打卡
java·数据结构·算法·leetcode·面试·贪心算法
报错小能手4 小时前
C++笔记(面向对象)详解单例模式
c++·笔记·单例模式