目录
一、什么是字符串?
字符串主要用于编程,概念说明、函数解释、用法详述见正文,这里补充一点:字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s="abcdefghij",则s[1]="b",s[9]="j",这可以给我们提供很多方便,如高精度运算时每一位都可以转化为数字存入数组。
二、如何定义字符串?
在C++中,我们会使用string来定义字符串,且string只出现在C++中(C这个系列),为了使用string,我们还需要使用一个头文件——cstring,当然用万能头也可以。
三、我们为什么要用字符串?
字符串的存储方式依然是以数组形式,主要是为了方便编程人员。如果"adfsdfdsfsdfsdfsdfsdfsdfsdfdsfsdfddfdsfdf"这么长的字符串让你手工存入数组,你可愿意?
四、字符串的运用!
题目一:
有个N个字母(A~Z)连成一个字符串X,你需要在N个字母中寻找到一个独特的连续长度为K的字符串P,使得这个任意连续长度为K的字符串P在字符串X中只出现一次。请问这个字符串P最短长度为多少。例如字符串X为ABCDABC,则满足要求的最短的字符串P的长度为4。也就是求字符串的最短不重复子串。长度为3的话ABC有重复,长度为2的话AB或者BC都有重复,长度为1的话A、B、C都有重复。
输入格式:
输入的第一行包含 N,第二行包含一个由 N 个字符组成的字符串,每个字符均在 A..Z 之内。
输出格式:
输出一行,包含一个整数,为可以解决的问题的最小 K 值
限制:
1≤N≤100
样例 1 :
输入:
7
ABCDABC
输出:
4
答案一:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n; string s;
set <string> x;
cin >> n; cin >> s;
for(int len=1; len<=n; len++) {
int flag=1;
for(int i=0; i<=s.size()-len; i++) {
if(x.count(s.substr(i,len))==1) {
flag=0;
break;}
else
x.insert(s.substr(i,len));
}
if(flag==1) {
cout << len;
break;
}
}
return 0;
}
题目二:
输入一个正整数p,换行后再输入一个字符串,对字符串进行如下处理:
遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。
展开方式:p=1时,对于字母子串,填充小写字母;p=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p=3时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号“*”来填充。
如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de ”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出 时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。
输入格式:
第1行为一个正整数p。第2行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。
输出格式:
只有一行,为展开后的字符串。
提示:
字符串长度不超过100;1<=p<=3。
样例 1 :
输入:
1
abcs-w1234-9s-4zz
输出:
abcstuvw123456789s-4zz
样例 2 :
输入:
3
a-d-d
输出:
a**d-d
答案二:
#include<bits/stdc++.h>
using namespace std;
int p; string a;
int main()
{
cin>>p; getchar(); int i; char j;
cin>>a; int len=a.size();
for(i=0;i<len;i++){
if(a[i]=='-'&&i>0){
if(a[i-1]>='0'&&a[i-1]<='9'&&a[i+1]>='0'&&a[i+1]<='9'&&a[i-1]<a[i+1]||a[i-1]>='a'&&a[i-1]<='z'&&a[i+1]>='a'&&a[i+1]<='z'&&a[i-1]<a[i+1]){
if(p==1)
for(j=a[i-1]+1;j<a[i+1];j++)
cout<<j;
else if(p==2){
if(a[i-1]>='a'&&a[i-1]<='z')
for(j=a[i-1]+1;j<a[i+1];j++){
char t=j-32; cout<<t;
}
else if(a[i-1]>='0'&&a[i-1]<='9')
for(j=a[i-1]+1;j<a[i+1];j++)
cout<<j;
}
if(p==3)
for(j=a[i-1]+1;j<a[i+1];j++)
cout<<'*';
}
else cout<<a[i];
}
else cout<<a[i];
}
return 0;
}
题目三:
n名同学参加了c++期末考试,他们的成绩单如下,但是有的人成绩单分数错了,会出现多次分数,如果出现了多次分数,按照较高的一个。请按照分数从高到低排序,如果成绩相同,则按照名字的字典序从小到大进行排序。
输入格式:
第一行一个整数n(n<=200000)表示有n个人参加了考试,接下来n组数据,每组数据包含两行,第一行为学生姓名(只包含引文小写字母和空格,且不超过200个字符),第二行为这个学生得到的分数(int范围以内)。
输出格式:
输出n行。排序之后的结果。
样例 1 :
输入:
4
Aha World
99
Tom Wang
80
Ahaa
99
Tom Wang
100
输出:
Tom Wang
Aha World
Ahaa
答案三:
#include<bits/stdc++.h>
using namespace std;
struct node{
int s;
char name[205];
}a[200005],b[200005];
int n;
bool cmp(node x,node y){
if(strcmp(x.name,y.name)==0){
return x.s>y.s;
} return strcmp(x.name,y.name)<0;
}
bool cmp1(node x,node y){
if(x.s==y.s){
return strcmp(x.name,y.name)<0;
} return x.s>y.s;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
gets(a[i].name);
gets(a[i].name);
scanf("%d",&a[i].s);
}
sort(a+1,a+n+1,cmp); int cnt=1;
for(int i=1;i<=n;i++){
if(strcmp(a[i].name,a[i-1].name)!=0)
b[cnt++]=a[i];
}
sort(b+1,b+cnt+1,cmp1);
for(int i=1;i<cnt;i++){
printf("%s\n",b[i].name);
}
return 0;
}
四、结语!
那么这期理论大家都听懂了吧,这期难度其实挺大的,代码敲了近一天,所以希望大家可以多三连,当然,关注我也是可以的!!!好的,那么这期就到此结束,下期理论些什么,由你们来决定,拜拜!!!