理论第十一课——字符串

目录

一、什么是字符串?

二、如何定义字符串?

三、我们为什么要用字符串?

四、字符串的运用!

        题目一:

        答案一:

        题目二:

        答案二:

        题目三:

        答案三:

四、结语!

五、下期你们想听什么?


一、什么是字符串?

        字符串主要用于编程,概念说明、函数解释、用法详述见正文,这里补充一点:字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如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;
}

四、结语!

        那么这期理论大家都听懂了吧,这期难度其实挺大的,代码敲了近一天,所以希望大家可以多三连,当然,关注我也是可以的!!!好的,那么这期就到此结束,下期理论些什么,由你们来决定,拜拜!!!

五、下期你们想听什么?

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值