面向对象程序设计(荣誉)实验一 String
Posted 上山打老虎D
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象程序设计(荣誉)实验一 String相关的知识,希望对你有一定的参考价值。
目录
1.串应用- 计算一个串的最长的真前后缀
题目描述
给定一个串,如ABCDAB,则ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA }ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB } 因此,该串的真前缀和真后缀中最长的相等串为AB,我们称之为该串的“最长的真前后缀”。试实现一个函数string matched_Prefix_Postfix(string str),得到输入串str的最长的真前后缀。若不存在最长的真前后缀则输出empty
输入
第1行:串的个数 n第2行到第n+1行:n个字符串
输出
n个最长的真前后缀,若不存在最长的真前后缀则输出empty。
样例输入
6
a
ab
abc
abcd
abcda
abcdab
样例输出
empty
empty
empty
empty
a
ab
题解
#include<iostream>
#include<string>
using namespace std;
string matched_Prefix_Postfix(string str){
string sfront[100],sback[100];
for(int i=1;i<str.length();i++){
sfront[i]=str.substr(0,i);
sback[i]=str.substr(str.length()-i,i);
}
string max="empty";
for(int i=1;i<str.length();i++){
if(sfront[i]==sback[i]) max=sfront[i];
}
return max;
}
int main (){
int t;
cin>>t;
while (t--)
{
string str;
cin>>str;
cout<<matched_Prefix_Postfix(str)<<endl;
}
return 0;
}
2.字符串替换(string)
题目描述
编写一个程序实现将字符串S中的所有子串A替换成子串B
输入
首先输入测试次数t
每次测试,首先输入字符串S,然后输入子串A,子串B
输出
输出替换后的字符串
样例输入
1
you are what you do
you
we
样例输出
we are what we do
题解
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
int t;
string StringObject,before_string,after_string;
cin >> t;
while(t--)
{
getchar();
getline(cin, StringObject);
cin >> before_string >> after_string;
while(StringObject.find(before_string)!=string::npos)
StringObject.replace(StringObject.find(before_string),before_string.size(),after_string);
cout << StringObject << endl;
}
return 0;
}
3.可重叠子串 (Ver. I)
题目描述
给定一个字符串(模式串)和一些待查找的字符串,求每个待查找字符串在模式串中出现的次数(可重叠)
输入
测试数据有多组(测试组数 <= 5),
第一行包括一个字符串P,长度不超过105,且非空串
第二行包括一个整数N,代表待查找的字符串数量 (1 <= N <= 5)
接下来的N行,每一行包括一个待查找的字符串,其长度不超过50,且非空串
输出
对于每组测试数据,
输出每个待查找字符串出现的次数,
具体输出见样例
样例输入
aabbcc
3
aa
bb
cc
ababab
1
aba
样例输出
aa:1
bb:1
cc:1
aba:2
题解
#include<bits/stdc++.h>
using namespace std;
int main()
{
string mode,str;
int num,t,k,i,u,f,j;
while(cin>>mode) {
cin >> t;
while(t--)
{
cin>>str;
string op[100000];
k=mode.length();
f=str.length();
num=0;
int num1;
j=0;
int e=0;
for(i=0;i<k;i++)
{
if(i+f<=k)
op[e++]=mode.substr(i,f);
}
num=0;
for(i=0;i<e;i++)
{
if(op[i]==str)
num++;
}
cout<<str<<":"<<num<<endl;
}
}
}
4.字符串操作(string)
题目描述
给定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操作表达式构成。
提示:本题练习string类使用,所有的操作可调用string的方法实现。
输入
第一行为一个整数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
题解
#include <iostream>
#include <string>
#include <stdlib.h>
#include <math.h>
using namespace std;
string str[20];
string command;
string copy();
string add();
int find();
int rfind();
string getstr()
{
string s;
cin >> s;
if (s == "copy")
return copy();
else if (s == "add")
return add();
else
return s;
}
int getnum()
{
string s;
cin >> s;
if (s == "find")
return find();
else if (s == "rfind")
return rfind();
else
return atoi(s.c_str());
}
string copy()
{
int N, X, L;
N = getnum();
X = getnum();
L = getnum();
return str[N - 1].substr(X, L);
}
string add()
{
string s1, s2;
s1 = getstr();
s2 = getstr();
int a = atoi(s1.c_str()), b = atoi(s2.c_str());
int flag = 0;
if ((s1 != "0" && a == 0) || (s2 != "0" && b == 0))
{
flag = 1;
}
if (flag == 0 && a >= 0 && a <= 99999 && b >= 0 && b <= 99999)
{
int c = a + b;
char chstr[6];
int d = c;
int i = 0;
while (1)
{
if (d / pow(10, i) < 10)
{
break;
}
i++;
}
chstr[i + 1] = '\\0';
for (int k = i; k >= 0; k--)
{
int d = c % 10;
chstr[k] = d + '0';
c = c / 10;
}
string ch = chstr;
return ch;
}
else
return s1 + s2;
}
int find()
{
string S;
int N;
S = getstr();
N = getnum();
if (str[N - 1].find(S) != string::npos)
{
return str[N - 1].find(S);
}
return str[N - 1].size();
}
int rfind()
{
string S;
int N;
S = getstr();
N = getnum();
if (str[N - 1].rfind(S) != 0)
{
return str[N - 1].rfind(S);
}
return str[N - 1].size();
}
int main()
{
int n;
cin >> n;
cin.get();
for (int i = 0; i < n; i++)
{
cin >> str[i];
}
while (cin >> command)
{
if (command == "over")
break;
else if (command == "insert")
{
string S;
int N, X;
S = getstr();
N = getnum();
X = getnum();
str[N - 1].insert(X, S);
}
else if (command == "reset")
{
string S;
int N;
S = getstr();
N = getnum();
str[N - 1].replace(0, str[N - 1].size(), S);
}
else if (command == "print")
{
int N;
N = getnum();
cout << str[N - 1] << endl;
}
else if (command == "printall")
{
for (int i = 0; i < n; i++)
{
cout << str[i] << endl;
}
}
}
}
以上是关于面向对象程序设计(荣誉)实验一 String的主要内容,如果未能解决你的问题,请参考以下文章
面向对象程序设计(荣誉)实验六 set,bitset,multimap
面向对象程序设计(荣誉)实验四 deque,stack,queue