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

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

`
``
/*
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. 输入
  11. 只有一个字符串(长度≤100),由大写英文字母组成,表示最终
  12. 的项链
  13. 。
  14. 输出
  15. 只有一个整数,表示国王没使用魔镜前,最初的项链可能的最
  16. 小长度
  17. 。
  18. 样例
  19. 输入复制
  20. ABB
  21. AABBA
  22. 输
  23. 出复制
  24. 2
  25. */
  26. #include <bits/stdc
  27. ++.h>
  28. using namespace
  29. std;
  30. bool jingmian(string s,int
  31. end){
  32. bool
  33. flag;
  34. if((end+1)%2 =
  35. = 0){
  36. flag =
  37. true;
  38. for(int i=0;i<=end/2;
  39. i++){
  40. //对称位
  41. 置相比较
  42. if(s[i]!=s[end
  43. -i]){
  44. flag=f
  45. alse;
  46. }
  47. }
  48. }el
  49. se
  50. {
  51. flag=f
  52. als
  53. e;
  54. }
  55. return
  56. fl
  57. ag;
  58. }
  59. int ma
  60. in()
  61. {
  62. /*
  63. 判断字符串是否可能
  64. 接触过镜面
  65. 如果可能,裁掉一半,继续判断,直到判断为不可能
  66. 接触到镜面
  67. 当前长度就是
  68. 最小长度
  69. */
  70. stri
  71. ng s;
  72. ci
  73. n>>s;
  74. int end = s.size()
  75. - 1;
  76. while(jingmian(s,end)==t
  77. rue){
  78. en
  79. d/=
  80. 2;
  81. }
  82. cout<<end+1<<
  83. endl;
  84. retu
  85. rn
  86. 0;
  87. }

`
``
/*

题目描述
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. 输入复制
  28. BEI
  29. jing
  30. bei
  31. Jing
  32. 输
  33. 出复制
  34. 3
  35. */
  36. #include <bits/stdc
  37. ++.h>
  38. using namespace
  39. std;
  40. string upstr(strin
  41. g s){
  42. for(int i=0;i<s.size();
  43. i++){
  44. s[i] = toupper(s
  45. [i]
  46. );
  47. }
  48. retu
  49. rn
  50. s;
  51. }
  52. int ma
  53. in()
  54. {
  55. /*
  56. 先判断完全
  57. 相等的情况
  58. 否则判断长
  59. 度相等情况
  60. 然后统一转化为大写
  61. ,再比较
  62. */
  63. string s
  64. 1,s2;
  65. i
  66. nt r;
  67. cin>>s1
  68. >>s2;
  69. if(s1=
  70. =s2){
  71. r
  72. = 2;
  73. }else if (s1.size()==s2.siz
  74. e()){
  75. if(upstr(s1)==upstr(
  76. s2)){
  77. r=3;
  78. }
  79. else{
  80. r=4
  81. ;
  82. }
  83. }
  84. else{
  85. r=
  86. 1;
  87. }
  88. cout<<r<<
  89. endl;
  90. retu
  91. rn
  92. 0;
  93. }

`
``
/*
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个字符

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