• 理论第十一课——字符串


    目录

    一、什么是字符串?

    二、如何定义字符串?

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

    四、字符串的运用!

            题目一:

            答案一:

            题目二:

            答案二:

            题目三:

            答案三:

    四、结语!

    五、下期你们想听什么?


    一、什么是字符串?

            字符串主要用于编程,概念说明、函数解释、用法详述见正文,这里补充一点:字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s="abcdefghij",则s[1]="b",s[9]="j",这可以给我们提供很多方便,如高精度运算时每一位都可以转化为数字存入数组。

    二、如何定义字符串

            在C++中,我们会使用string来定义字符串,且string只出现在C++中(C这个系列),为了使用string,我们还需要使用一个头文件——cstring,当然用万能头也可以。

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

            字符串的存储方式依然是以数组形式,主要是为了方便编程人员。如果"adfsdfdsfsdfsdfsdfsdfsdfsdfdsfsdfddfdsfdf"这么长的字符串让你手工存入数组,你可愿意?

    四、字符串的运用!

            题目一:

    1. 有个N个字母(A~Z)连成一个字符串X,你需要在N个字母中寻找到一个独特的连续长度为K的字符串P,使得这个任意连续长度为K的字符串P在字符串X中只出现一次。请问这个字符串P最短长度为多少。例如字符串X为ABCDABC,则满足要求的最短的字符串P的长度为4。也就是求字符串的最短不重复子串。长度为3的话ABC有重复,长度为2的话AB或者BC都有重复,长度为1的话A、B、C都有重复。
    2. 输入格式:
    3. 输入的第一行包含 N,第二行包含一个由 N 个字符组成的字符串,每个字符均在 A..Z 之内。
    4. 输出格式:
    5. 输出一行,包含一个整数,为可以解决的问题的最小 K 值
    6. 限制:
    7. 1≤N≤100
    8. 样例 1 :
    9. 输入:
    10. 7
    11. ABCDABC
    12. 输出:
    13. 4

            答案一:

    1. #include
    2. using namespace std;
    3. int main() {
    4. int n; string s;
    5. set x;
    6. cin >> n; cin >> s;
    7. for(int len=1; len<=n; len++) {
    8. int flag=1;
    9. for(int i=0; i<=s.size()-len; i++) {
    10. if(x.count(s.substr(i,len))==1) {
    11. flag=0;
    12. break;}
    13. else
    14. x.insert(s.substr(i,len));
    15. }
    16. if(flag==1) {
    17. cout << len;
    18. break;
    19. }
    20. }
    21. return 0;
    22. }

            题目二:

    1. 输入一个正整数p,换行后再输入一个字符串,对字符串进行如下处理:
    2. 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。
    3. 展开方式:p=1时,对于字母子串,填充小写字母;p=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p=3时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号“*”来填充。
    4. 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de ”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出 时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。
    5. 输入格式:
    6. 1行为一个正整数p。第2行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。
    7. 输出格式:
    8. 只有一行,为展开后的字符串。
    9. 提示:
    10. 字符串长度不超过1001<=p<=3
    11. 样例 1 :
    12. 输入:
    13. 1
    14. abcs-w1234-9s-4zz
    15. 输出:
    16. abcstuvw123456789s-4zz
    17. 样例 2 :
    18. 输入:
    19. 3
    20. a-d-d
    21. 输出:
    22. a**d-d

            答案二:

    1. #include
    2. using namespace std;
    3. int p; string a;
    4. int main()
    5. {
    6. cin>>p; getchar(); int i; char j;
    7. cin>>a; int len=a.size();
    8. for(i=0;i
    9. if(a[i]=='-'&&i>0){
    10. if(a[i-1]>='0'&&a[i-1]<='9'&&a[i+1]>='0'&&a[i+1]<='9'&&a[i-1]1]||a[i-1]>='a'&&a[i-1]<='z'&&a[i+1]>='a'&&a[i+1]<='z'&&a[i-1]1]){
    11. if(p==1)
    12. for(j=a[i-1]+1;j1];j++)
    13. cout<
    14. else if(p==2){
    15. if(a[i-1]>='a'&&a[i-1]<='z')
    16. for(j=a[i-1]+1;j1];j++){
    17. char t=j-32; cout<
    18. }
    19. else if(a[i-1]>='0'&&a[i-1]<='9')
    20. for(j=a[i-1]+1;j1];j++)
    21. cout<
    22. }
    23. if(p==3)
    24. for(j=a[i-1]+1;j1];j++)
    25. cout<<'*';
    26. }
    27. else cout<
    28. }
    29. else cout<
    30. }
    31. return 0;
    32. }

            题目三:

    1. n名同学参加了c++期末考试,他们的成绩单如下,但是有的人成绩单分数错了,会出现多次分数,如果出现了多次分数,按照较高的一个。请按照分数从高到低排序,如果成绩相同,则按照名字的字典序从小到大进行排序。
    2. 输入格式:
    3. 第一行一个整数n(n<=200000)表示有n个人参加了考试,接下来n组数据,每组数据包含两行,第一行为学生姓名(只包含引文小写字母和空格,且不超过200个字符),第二行为这个学生得到的分数(int范围以内)。
    4. 输出格式:
    5. 输出n行。排序之后的结果。
    6. 样例 1 :
    7. 输入:
    8. 4
    9. Aha World
    10. 99
    11. Tom Wang
    12. 80
    13. Ahaa
    14. 99
    15. Tom Wang
    16. 100
    17. 输出:
    18. Tom Wang
    19. Aha World
    20. Ahaa

            答案三:

    1. #include
    2. using namespace std;
    3. struct node{
    4. int s;
    5. char name[205];
    6. }a[200005],b[200005];
    7. int n;
    8. bool cmp(node x,node y){
    9. if(strcmp(x.name,y.name)==0){
    10. return x.s>y.s;
    11. } return strcmp(x.name,y.name)<0;
    12. }
    13. bool cmp1(node x,node y){
    14. if(x.s==y.s){
    15. return strcmp(x.name,y.name)<0;
    16. } return x.s>y.s;
    17. }
    18. int main()
    19. {
    20. cin>>n;
    21. for(int i=1;i<=n;i++){
    22. gets(a[i].name);
    23. gets(a[i].name);
    24. scanf("%d",&a[i].s);
    25. }
    26. sort(a+1,a+n+1,cmp); int cnt=1;
    27. for(int i=1;i<=n;i++){
    28. if(strcmp(a[i].name,a[i-1].name)!=0)
    29. b[cnt++]=a[i];
    30. }
    31. sort(b+1,b+cnt+1,cmp1);
    32. for(int i=1;i
    33. printf("%s\n",b[i].name);
    34. }
    35. return 0;
    36. }

    四、结语!

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

    五、下期你们想听什么?

  • 相关阅读:
    idea项目设置鼠标右键点击文件夹通过IDEA打开
    基于element ui 城市选择之间的级联选择
    常用的主流音乐编曲软件有哪些?
    【C语言】详解 malloc 、calloc函数的区别
    互联网Java工程师面试题·Dubbo篇·第一弹
    前端点击地图上的位置获取当前经纬度
    win10睡眠快捷方式
    Leetcode 剑指 Offer II 053. 二叉搜索树中的中序后继
    Cesium屏幕中心坐标和相机位置坐标计算
    小鱼送激光雷达啦 | 恰饭即抽奖第一期
  • 原文地址:https://blog.csdn.net/zyxtjzys/article/details/127568945