[关闭]
@pandaoxi2022 2022-08-02T20:49:39.000000Z 字数 7181 阅读 367

String

基础知识

什么是st

ring

string是c++的stl(standard template library 标准模板库)提供的字符串类,用于处理字符串相

关的问题

string与char s[

]的区别

1.字符数组本质是数组,因此长度固定;string可以理解为长度不限的

字符串.

2.字符数组的系统定义的函数过少,操作不方便;string集成大量的系统函数,方

便操作.

3.字符数组不能比较及+运算;string可以直接作比较

和运算.

stri

ng操作

string的读

入和遍历

s1后面

`
``
/*
1093 - 【入门】打印
小写字母表

题目描述
把英文字母表的小写字母按顺序和倒序打印出来。(每行

13个
)

输入

输出

输出四

样例

输入复制

输出复制
abcdefgh
ijklm
nopqrstu
vwxyz
zyxwvuts
rqpon
mlkjihgf
edcb
a
*/

++.h>
using namespace

std;

int ma
in()
{
/*

1.升序
利用字符的ascii码值,或者直接写'a',循环遍历,将每次的字符连接
到s的末尾
2
. 降序
3.简单算法,可单独判断到某个字符
之后换行

*/ 
stri

ng s;
ch
ar c;
for(c='a';c<='z';
c++){
s +
= c ;
if((c-'a'+1)%13==0) s+=
'\n'
;
}
for(c='z';c>='a';
c--){
s +
= c ;
if(('z'-c+1)%13==0) s+=
'\n'
;
}
cout< endl;
retu
rn
0;
}

  1. `
  2. ``
  3. /*
  4. 1115 - 【入
  5. 门】数字和
  6. 题目描述
  7. 输入一个很大的数,求各位上的
  8. 数字和
  9. 输入
  10. 一个很大的整数(不超过2
  11. 00位
  12. 输出
  13. 一个整
  14. 样例
  15. 输入复
  16. 123
  17. 出复制
  18. 6
  19. */
  20. #include <bits/stdc
  21. ++.h>
  22. using namespace
  23. std;
  24. //变量定义到main函数外边为全局变量,全局变量在整个程序所有函数中都
  25. 可以使用.
  26. //局部变量仅在定义时对应的大括
  27. 号内有效
  28. //int初始值0,小数初始值0.0,字符类型初始值'\0',bool初始值false,int a[100]
  29. 一百个0
  30. //INT_MAX 常量,代表整
  31. 数最大的数
  32. //INT_MIN 常量,代表整数
  33. 最大的数
  34. stri
  35. ng s;
  36. int s
  37. um;
  38. int ma
  39. in()
  40. {
  41. /*
  42. 遍历,转
  43. 换,累加
  44. */
  45. ci
  46. n>>s;
  47. for(int i=0;i<s.size();
  48. i++){
  49. sum += s[i]
  50. -'0
  51. ';
  52. }
  53. cout<<sum<<
  54. endl;
  55. retu
  56. rn
  57. 0;
  58. }
  59. `
  60. ``
  61. `
  62. ``
  63. /*
  64. 1101 - 【入门】
  65. 时间的差!
  66. 题目描述
  67. 看到两个标准格式的时间,有小时,有分钟,有秒,格式如:h:m:s,即 时:分:秒 你想知道,这两个时间之间相差
  68. 多少吗
  69. 输入
  70. 输入包括两行,两行均为一个“时:分:秒”格式的时间。且本题保证第一个时间一定大于第二
  71. 个时间
  72. 输出
  73. 输出就是输入的两个时间之间的
  74. 秒数差
  75. 样例
  76. 输入复制
  77. 01:
  78. 10:10
  79. 00:
  80. 30:30
  81. 输出复制
  82. 238
  83. 0
  84. */
  85. #include <bits/stdc
  86. ++.h>
  87. using namespace
  88. std;
  89. int num(strin
  90. g s){
  91. //02:
  92. 20:03
  93. int
  94. r=0;
  95. //将前两个字符截取出来,用10位*10
  96. 加上个位
  97. int h = (s[0]-'0')*10 + (s[1]-
  98. '0');
  99. int m = (s[3]-'0')*10 + (s[4]-
  100. '0');
  101. int ss = (s[6]-'0')*10 + (s[7]-
  102. '0
  103. ');
  104. r = h*60*60 + m*60
  105. + ss;
  106. retu
  107. rn r
  108. ;
  109. }
  110. int ma
  111. in()
  112. {
  113. /*
  114. 1.求字符串距离00:00:
  115. 00总秒数
  116. 2.相减
  117. */
  118. string s
  119. 1,s2;
  120. cin>>s1
  121. >>
  122. s2;
  123. cout<<num(s1)-num(s2)<<
  124. endl;
  125. retu
  126. rn
  127. 0;
  128. }

`
``
/*
1480 - 【基础】找字典码最
小的字符串

题目描述
编写程序,针对输入的N个不同的字符串,输出其中字典码最小的

字符串

输入
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,

制表符

输出
输出字典码最小

的字符

样例


入复制

5
Li

Wan
g
Zh
a
Jin

Xian

输出复

Ji
n
*/

++.h>
using namespace
std;
//变量定义到main函数外边为全局变量,全局变量在整个程序所有函数中都
可以使用.
//局部变量仅在定义时对应的大括
号内有效
//int初始值0,小数初始值0.0,字符类型初始值'\0',bool初始值false,int a[100]
一百个0
//INT_MAX 常量,代表整
数最大的数
//INT_MIN 常量,代表整数
最大的数
int ma
in()
{
/*
先读一个字符串作为比较字符串,然后以pk的方式找
到最小的

*/ 
i

nt n;
string s,
min;
ci
n>>n;
cin>

min;
for(int i=1;i i++){
ci
n>>s;
if(s<
min){
m
in=s
;

}
}
cout<<min<<

endl;
retu
rn
0;
}

  1. `
  2. ``
  3. /*
  4. 1134 - 【基础】
  5. 国王的魔镜
  6. 题目描述
  7. 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。 比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。 给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最
  8. 小长度
  9. 输入
  10. 只有一个字符串(长度≤100),由大写英文字母组成,表示最终
  11. 的项链
  12. 输出
  13. 只有一个整数,表示国王没使用魔镜前,最初的项链可能的最
  14. 小长度
  15. 样例
  16. 输入复制
  17. ABB
  18. AABBA
  19. 出复制
  20. 2
  21. */
  22. #include <bits/stdc
  23. ++.h>
  24. using namespace
  25. std;
  26. bool jingmian(string s,int
  27. end){
  28. bool
  29. flag;
  30. if((end+1)%2 =
  31. = 0){
  32. flag =
  33. true;
  34. for(int i=0;i<=end/2;
  35. i++){
  36. //对称位
  37. 置相比较
  38. if(s[i]!=s[end
  39. -i]){
  40. flag=f
  41. alse;
  42. }
  43. }
  44. }el
  45. se
  46. {
  47. flag=f
  48. als
  49. e;
  50. }
  51. return
  52. fl
  53. ag;
  54. }
  55. int ma
  56. in()
  57. {
  58. /*
  59. 判断字符串是否可能
  60. 接触过镜面
  61. 如果可能,裁掉一半,继续判断,直到判断为不可能
  62. 接触到镜面
  63. 当前长度就是
  64. 最小长度
  65. */
  66. stri
  67. ng s;
  68. ci
  69. n>>s;
  70. int end = s.size()
  71. - 1;
  72. while(jingmian(s,end)==t
  73. rue){
  74. en
  75. d/=
  76. 2;
  77. }
  78. cout<<end+1<<
  79. endl;
  80. retu
  81. rn
  82. 0;
  83. }

`
``
/*

题目描述
Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后5位对应的字符来代替,这样就得到了密文。比如字符A用F来代替。如下是密文和明文中字符的
对应关系。
密文:A B C D E F G H I J K L M N O P Q R S T U V W
X Y Z
明文:V W X Y Z A B C D E F G H I J K L M N O P Q R
S T U
你的任务是对给定的密文进行解密
得到明文。
你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进

行解码

输入
一行,给出密文,密文不为空,而且其中的字符数不超过

200

输出
输出一行,即密文对应

的明文

样例

输入复制
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ H
FZXJX

输出复制
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL C
AUSE
S
*/

++.h>
using namespace

std;

int ma
in()
{

/*


*/ 
stri

ng s;
getline(ci
n,s);
for(int i=0;i i++){
if(s[i]>='A' && s[i]<=
'Z'){
//s[i]=(s[i]-'A'-5+26) % 26
+'A'
if(s[i]>='F' && s[i]<='Z') s[i
]-=5;
else s[i]+='V'
-'A'
;

}
}
cout<<s<<

endl;
retu
rn
0;
}

  1. 作业题
  2. `
  3. ``
  4. /*
  5. 1475 - 【入门】
  6. 字符串对比
  7. 题目描述
  8. 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到100之间),它们之间的关系是以下4种情
  9. 况之一:
  10. 1:两个字符串长度不等。比如 Beijing 和 H
  11. ebei
  12. 2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Bei
  13. jing
  14. 3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEI
  15. jing
  16. 4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nan
  17. jing
  18. 编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的
  19. 编号。
  20. 输入
  21. 包括两行,每行都是一
  22. 个字符
  23. 输出
  24. 仅有一个数字,表明这两个字符串的
  25. 关系编号
  26. 输入复制
  27. BEI
  28. jing
  29. bei
  30. Jing
  31. 出复制
  32. 3
  33. */
  34. #include <bits/stdc
  35. ++.h>
  36. using namespace
  37. std;
  38. string upstr(strin
  39. g s){
  40. for(int i=0;i<s.size();
  41. i++){
  42. s[i] = toupper(s
  43. [i]
  44. );
  45. }
  46. retu
  47. rn
  48. s;
  49. }
  50. int ma
  51. in()
  52. {
  53. /*
  54. 先判断完全
  55. 相等的情况
  56. 否则判断长
  57. 度相等情况
  58. 然后统一转化为大写
  59. ,再比较
  60. */
  61. string s
  62. 1,s2;
  63. i
  64. nt r;
  65. cin>>s1
  66. >>s2;
  67. if(s1=
  68. =s2){
  69. r
  70. = 2;
  71. }else if (s1.size()==s2.siz
  72. e()){
  73. if(upstr(s1)==upstr(
  74. s2)){
  75. r=3;
  76. }
  77. else{
  78. r=4
  79. ;
  80. }
  81. }
  82. else{
  83. r=
  84. 1;
  85. }
  86. cout<<r<<
  87. endl;
  88. retu
  89. rn
  90. 0;
  91. }

`
``
/*
1478 - 【入门】出现次数最多
的小写字母

题目描述
输入一个由小写字母组成的字符串(字符数量<=100),输出出现次数最多的小

写字母。

注意:如果有多个小写字母出现的次数一样多,则输出ASCII码值最大的那

个字母

输入

个字符

输出
出现次数最多的

小写字

样例

输入复制
aaabbbbbbbb
bcdxs


出复制

b
*/

++.h>
using namespace

std;

int ma
in()
{
/*
先将每个字符有多少个放
到桶数组中
遍历桶,pk找到
大的就换

*/ 
stri

ng s;
int max
= 0;
ch
ar c;
int a[150]
={0};
ci
n>>s;
for(int i=0;i i++){
a[s[i
]]+
+;
}
for(int i=0;i<150;
i++){
if(a[i]>=m
ax) {
max =
a[i];
c
= i;

}

}

cout<<c<<

endl;
retu
rn 0

;
}


`
`

/*
1100 - 【入门
】词组缩写

题目描述
定义:一个词组中每个单词的首字母的大写组合称为该词组的缩写。 比如,C语言里常用的EOF就是end of fil
e的缩
写。
输入
测试数据占一行,有一个词组,每个词组由一个或多个单词组成;每组的单词个数不超过10个,每个单词有一个或多个大写或小写字母组成; 单词长度不超过10,由一个或多个空格分隔这

些单词

输出
输出规

定的缩

样例

输入复制
end of
file

输出复

EO
F
*/

++.h>
using namespace

std;

string

s;

int ma
in()
{
/*
将字符串最前方加空格,就不用判断
开头的情况
首字母的条件是,当前不是空格,前一
位是空格。
找到首字母后将其转化为
大写即可

*/ 

getline(ci

n,s);
s = " "
+ s;
for(int i=1;i i++){
if(s[i] != ' ' && s[i-1] ==
' '){
cout< i]))
;

}
}

retu

rn
0;

}

`
`

/*
1103 - 【基础】
字符串压缩

题目描述
输入字符串,输出压缩后的字符串。压缩的方法是把连续的相同字母压缩为"长度+字母"的形式,在本题中,单个的字母不需

要压缩

输入
一行,一个字符串,只包含小写英文字母,长度不超过

255

输出
样例

输入复制
aaab
bbbbx

输出复制

3a5b
x
*/

++.h>
using namespace

std;

strin
g s;
int

c;

int ma
in()
{
/*

历字符串

动计数器
判断当前字符是否和后一字符相同,如果不同, 则输出计数器
和当前字符
同时重置计数器,为下一个字
符做准备

*/ 

getline(ci

n,
s);

for(int i=0;i<s.size();

i++){

c++;
    //如果是最后一个连续字母或者是整个字符串最后一位则

开始输出
if(s[i+1] != s[i] || i == s.size(
)-1){
//计数器大于1才
输出数字
if(c>1) cou
t< cout< [i];
c
= 0
;

}
}

retu

rn
0;

}

`
`

/*
1012 - 【基础】我是
第几个单词

题目描述
输入一个英文句子,例如:“This is a Book.",可以看到句子是以“.”来作为结束符号的,并且单词之间以一个空格来分隔。接着再输入一个单词A,请找出首次在句子中出现的与A相同的单词,是句子中的第几个单词,若不存在,则输出该句子中单词字符的总个数。 例如对上句子而言,若输入单词“is”,则应输出:2 若输入单词“isa”,则应输

出:1
1

输入
第一行为以‘.’结束的一个词组(仅由若干个单词组成,单词间由一空格隔开,除单词和最后的“.”以外,不含其

它字符)

第二行是一个单词(不

含空格

输出

一个整

样例

输入复制
This is a
Book.

Book


出复制

4
*/

++.h>
using namespace

std;

string s,word,t
emp;
int c,in
dex;
bool flag = fa

lse;

int ma
in()
{
/*

历字符串
使用临时字符串存储当前找到
的单词。
使用计数器记录当
前单词顺序
使用计数器记录
总字符数
使用flag标记
是否
包含

判断当前字符是否为连续的字母,如果下一个字符是空格或者到了结尾,则

进行处理
使用计数器记录当前是第
几个单词
将字符串长度累加到总字
符数中。
判断得到的字符串是不是要找的,如果是,输出当前计数器,并且退出循环,退出之前需

要标记

*/ 

getline(ci

n,s);
getline(cin,w
or
d);

for(int i=0;i<s.size()-1;

i++){
if(s[i]!=
' '){
temp = temp +
s[i];
//如果是最后一个连续字母或者是整个字符串最后一位则
开始输出
if(s[i+1] == ' ' || s[i+1] ==
'.'){
ind
ex++;
//cout< endl;
c += temp.si
ze();
if(temp == w
ord){
cout< ndex;
flag =
true;
b
reak;

            }
            temp 

= "";

        }

    }

}
if(!f

lag){
cou
t<

;
}

retu

rn
0;
}


`
`

/*
1123 - 【基础】
表达式的值

题目描述
给出一个表达式,其中运算符仅包含+,要求求出表达式
的最终值。
如:1+1,则结果为2,1+2+3则结果为6,12+23则结果

35。

输入
仅一行,即为含有正整数和+号的

表达式

输出
仅一行,既为表达式算出的结果(所有数据保证计算结果<=1

09)

样例

输入复

1+1


出复制

2
*/

++.h>
using namespace

std;

string s,t
emp;
int
sum;
bool flag = fa

lse;

int ma
in()
{
/*

历字符串
使用临时字符串存储当前找
到的数字。
使用计数器
记录
总和

判断当前字符是否为连续的数字,如果下一个字符是+或者到了结尾,则

进行处理
使用计数器

累加。

*/ 

getline(ci

n,
s);

for(int i=0;i<s.size();

i++){
if(s[i]!=
'+'){
temp = temp +
s[i];
//如果是最后一个连续字母或者是整个字符串最后一位则
开始输出
if(s[i+1] == '+' || i==s.size(
)-1){
//cout< endl;
sum += stoi(t
emp);
temp
= "";

        }

    }

}
cout<<

sum;

retu

rn
0;

}

`
`

/*
1127 - 【基础】
整数的拼接

题目描述
设有n个整数(3≤n≤100),将这些整数拼接起来,可以形成一个最
大的整数。
例如:n=3,三个整数分别为21 7 34, 拼接后最大的整数为:
73421
再比如:n=3,三个整数分别是1 10 110,拼接后最大的整数是:11

101
0

输入
第一行一个整数n ,表示有n
个整数。
第二行n个整数,数与数之间用一个空

格分隔

输出
输出到屏幕 。一个拼接后的最大

的整数

样例


入复制
3
21
7 34

输出复制

7342
1
*/

++.h>
using namespace

std;

string s[1
10];
in
t n;
bool flag = fa

lse;

bool cmp(string s1,string
s2){
return s1+s2>s
2+s1

;
}

int ma
in()
{
/*
(错误)比较字典序,字典序较大的排前面,所以完成string数组的
排序就行
s
1=10;

s2=1;
s1+s2
=101;
s2+s1
=110;
110

101;

*/ 
ci

n>>n;
for(int i=0;i i++){
cin>>
s[i
];
}
sort(s,s+n,
cmp);
for(int i=0;i i++){
cout<<
s[i
];

}

retu

rn
0;
}

```

strin

g常见函数
查找函数是find(),里面可以是一个字符,也可以是字符串,如果找到返回第一个出
现的位置,
如果找不到返回-1这个是从前

往后查找

截取取子串的函数是:substr(),
形式如下:
s.substr();//返回s
的全部内容
s.substr(11);//从索引1
1往后的子串
s.substr(5,6);//从索引5开始6个字符

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注