字符串题目合集(下)
ps:题目来源:acwing!!! y总yyds!!!
8.字符串匹配
题目
给定两个长度相同的字符串 a 和字符串 b。
如果在某个位置 ii 上,满足字符串 a 上的字符 a[i] 和字符串 b 上的字符 b[i] 相同,那么这个位置上的字符就是匹配的。
如果两个字符串的匹配位置的数量与字符串总长度的比值大于或等于 k,则称两个字符串是匹配的。
现在请你判断给定的两个字符串是否匹配。
输入格式
第一行包含一个浮点数 k,第二行包含字符串 a,第三行包含字符串 b。
输入的字符串中不包含空格。
输出格式
如果两个字符串匹配,则输出 yes
。
否则,输出 no
。
数据范围
0 ≤ k ≤ 1 ,
字符串的长度不超过 100。
输入样例:
0.4
abcde
xbacd
输出样例:
no
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
string a,b;
double k;
cin>>k>>a>>b;
int cnt=0;
for(int i=0;i<a.size();i++)
{
if(a[i]==b[i])
{
cnt++;
}
}
if((double)cnt/a.size()>=k)
{
printf("yes");
}
else
printf("no");
return 0;
}
9.忽略大小写比较字符串大小
题目
一般我们用 strcmp 可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按 ASCII 码值大小比较),直到出现不同的字符或遇到 \0
为止。
如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。
但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如 Hello
和 hello
在忽略字母大小写时是相等的。
请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。
输入格式
输入为两行,每行一个字符串,共两个字符串。注意字符串中可能包含空格。
数据保证每个字符串的长度都不超过 80。
输出格式
如果第一个字符串比第二个字符串小,输出一个字符 <
。
如果第一个字符串比第二个字符串大,输出一个字符 >
。
如果两个字符串相等,输出一个字符 =
。
输入样例:
Hello
hello
输出样例:
=
AC代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
char a[100],b[100];
fgets(a,100,stdin);
fgets(b,100,stdin);
if(a[strlen(a)-1]=='\n')a[strlen(a)-1]=0;//去掉末尾的回车
if(b[strlen(b)-1]=='\n')b[strlen(b)-1]=0;//去掉末尾的回车
for(int i=0;a[i];i++)
{
if(a[i]>='A'&&a[i]<='Z')
{
a[i]+=32;
}
}
for(int i=0;b[i];i++)
{
if(b[i]>='A'&&b[i]<='Z')
{
b[i]+=32;
}
}
int t=strcmp(a,b);
if(t==0)
puts("=");
else if(t<0)
puts("<");
else
puts(">");
return 0;
}
10.去掉多余的空格
题目
输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。
输入格式
共一行,包含一个字符串。
输出格式
输出去掉多余空格后的字符串,占一行。
数据范围
输入字符串的长度不超过 200。
保证输入字符串的开头和结尾没有空格。
输入样例:
Hello world.This is c language.
输出样例:
Hello world.This is c language.
思路
这里是个小技巧,可以充分利用cin和cout的特性,so easy!
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
string a;
while(cin>>a)
{
cout<<a<<' ';
}
return 0;
}
11.信息加密
题目
在传输信息的过程中,为了保证信息的安全,我们需要对原信息进行加密处理,形成加密信息,从而使得信息内容不会被监听者窃取。
现在给定一个字符串,对其进行加密处理。
加密的规则如下:
- 字符串中的小写字母,a 加密为 b,b 加密为 c,…,y 加密为 z,z 加密为 a。
- 字符串中的大写字母,A 加密为 B,B 加密为 C,…,Y 加密为 Z,Z 加密为 A。
- 字符串中的其他字符,不作处理。
请你输出加密后的字符串。
输入格式
共一行,包含一个字符串。注意字符串中可能包含空格。
输出格式
输出加密后的字符串。
数据范围
输入字符串的长度不超过 100。
输入样例:
Hello! How are you!
输出样例:
Ifmmp! Ipx bsf zpv!
AC代码
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s1;
getline(cin,s1);
//cout << s1.size()<<endl;
for(int i =0;i<s1.size();i++){
if(s1[i] == 'Z') s1[i]='A';
else if (s1[i] == 'z') s1[i]='a';
else if((s1[i] >= 'a' && s1[i] <= 'z')||(s1[i] >= 'A' &&s1[i] <= 'Z'))
s1[i] = (char)((int)s1[i]+1);
}
cout << s1 <<endl;
return 0;
}
12.输出字符串
题目
给定一个字符串 a,请你按照下面的要求输出字符串 b。
给定字符串 a 的第一个字符的 ASCII 值加第二个字符的 ASCII 值,得到 b 的第一个字符;
给定字符串 a 的第二个字符的 ASCII 值加第三个字符的 ASCII 值,得到 b 的第二个字符;
…
给定字符串 a 的倒数第二个字符的 ASCII 值加最后一个字符的 ASCII 值,得到 b 的倒数第二个字符;
给定字符串 a 的最后一个字符的 ASCII 值加第一个字符的 ASCII 值,得到 b 的最后一个字符。
输入格式
输入共一行,包含字符串 a。注意字符串中可能包含空格。
数据保证字符串内的字符的 ASCII 值均不超过 63。
输出格式
输出共一行,包含字符串 b。
数据范围
2≤a的长度≤100
输入样例:
1 2 3
输出样例:
QRRSd
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
string a;
getline(cin,a);
for(int i=0;i<a.size()-1;i++)
{
cout<<char(a[i]+a[i+1]);
}
cout<<char(a[a.size()-1]+a[0]);
return 0;
}
13.单词替换
题目
输入一个字符串,以回车结束(字符串长度不超过 100)。
该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。
现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入格式
输入共 3 行。
第 1 行是包含多个单词的字符串 s;
第 2 行是待替换的单词 a(长度不超过 100);
第 3 行是 a 将被替换的单词 b(长度不超过 100)。
输出格式
共一行,输出将 s 中所有单词 a 替换成 b 之后的字符串。
输入样例:
You want someone to help you
You
I
输出样例:
I want someone to help you
思路
把一个字符串换成一个字符串流
把ssin当成cin用就行
#include <sstream>
stringstream ssin(s);
AC代码
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
string s,a,b;
getline(cin,s);
cin>>a>>b;
stringstream ssin(s);
string str;
while(ssin>>str)
{
if(str==a)
cout<<b<<' ';
else
cout<<str<<' ';
}
return 0;
}
14.字符串中最长的连续出现的字符
题目
求一个字符串中最长的连续出现的字符,输出该字符及其出现次数,字符串中无空白字符(空格、回车和 tab),如果这样的字符不止一个,则输出第一个。
输入格式
第一行输入整数 N,表示测试数据的组数。
每组数据占一行,包含一个不含空白字符的字符串,字符串长度不超过 200。
输出格式
共一行,输出最长的连续出现的字符及其出现次数,中间用空格隔开。
输入样例:
2
aaaaabbbbbcccccccdddddddddd
abcdefghigk
输出样例:
d 10
a 1
AC代码
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
string str;
cin>>str;
int cnt=0;
char c;
for(int i=0;i<str.size();i++)//第一类双指针算法
{
int j=i;
while(j<str.size()&&str[j]==str[i])
j++;
if(j-i>cnt)
{
cnt=j-i;
c=str[i];
}
i=j-1;
}
cout<<c<<' '<<cnt<<endl;
}
return 0;
}
15.最长单词
题目
一个以 .
结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式,求句子中的最长单词。
输入格式
输入这个简单英文句子,长度不超过 500。
输出格式
该句子中最长的单词。如果多于一个,则输出第一个。
输入样例:
I am a student of Peking University.
输出样例:
University
AC代码
#include<iostream>
using namespace std;
int main()
{
string res,str;
while(cin>>str)
{
if(str.back()=='.')
str.pop_back();
if(str.size()>res.size())
res=str;
}
cout<<res<<endl;
return 0;
}
16.倒排单词
题目
编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
输入格式
输入为一个字符串(字符串长度至多为 100)。
输出格式
输出为按要求排序后的字符串。
输入样例:
I am a student
输出样例:
student a am I
AC代码
#include<iostream>
using namespace std;
int main()
{
string str[100];
int n=0;
while(cin>>str[n])
n++;
for(int i=n-1;i>=0;i--)
{
cout<<str[i]<<' ';
}
cout<<endl;
return 0;
}
17.字符串移位包含问题
题目(这题有点难)
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串 s1 和 s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。
例如 CDAA
是由 AABCD
两次移位后产生的新串 BCDAA
的子串,而 ABCD
与 ACBD
则不能通过多次移位来得到其中一个字符串是新串的子串。
输入格式
共一行,包含两个字符串,中间由单个空格隔开。
字符串只包含字母和数字,长度不超过 30。
输出格式
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出 true
,否则输出 false
。
输入样例:
AABCD CDAA
输出样例:
true
AC代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string a, b;
cin >> a >> b;
if (a.size() < b.size())
swap(a, b);
for (int i = 0; i < a.size(); i ++ )
{
a = a.substr(1) + a[0];
for (int j = 0; j + b.size() <= a.size(); j ++ )
{
int k = 0;
for (; k < b.size(); k ++ )
if (a[j + k] != b[k])
break;
if (k == b.size())
{
puts("true");
return 0;
}
}
}
puts("false");
return 0;
}
18.字符串乘方
题目(这题也有点难)
给定两个字符串 a 和 b,我们定义 a×b 为他们的连接。
例如,如果 a=abc
而 b=def
, 则 a×b=abcdef
。
如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=``(空字符串),a(n+1)=a×(an)。
输入格式
输入包含多组测试样例,每组测试样例占一行。
每组样例包含一个字符串 s,s 的长度不超过 100。
最后的测试样例后面将是一个点号作为一行。
输出格式
对于每一个 s,你需要输出最大的 n,使得存在一个字符串 a,让 s=an。
输入样例:
abcd
aaaa
ababab
.
输出样例:
1
4
3
AC代码
#include<iostream>
using namespace std;
int main()
{
string str;
while(cin>>str,str!=".")
{
int len=str.size();
for(int n=len;n;n--)
{
if(len%n==0)
{
int m=len/n;
string s=str.substr(0,m);
string r;
for(int i=0;i<n;i++)
{
r+=s;
}
if(r==str)
{
cout<<n<<endl;
break;
}
}
}
}
return 0;
}
19.字符串最大跨距
题目(这题也难)
有三个字符串 S,S1,S2,其中,S 长度不超过 300,S1 和 S2 的长度不超过 10。
现在,我们想要检测 S1 和 S2 是否同时在 S 中出现,且 S1 位于 S2 的左边,并在 S 中互不交叉(即,S1 的右边界点在 S2 的左边界点的左侧)。
计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2 的起始点与最左边的 S1 的终止点之间的字符数目)。
如果没有满足条件的 S1,S2 存在,则输出 −1。
例如,S= abcd123ab888efghij45ef67kl
, S1= ab
, S2= ef
,其中,S1 在 S 中出现了 2 次,S2 也在 S 中出现了 2 次,最大跨距为:18。
输入格式
输入共一行,包含三个字符串 S,S1,S2,字符串之间用逗号隔开。
数据保证三个字符串中不含空格和逗号。
输出格式
输出一个整数,表示最大跨距。
如果没有满足条件的 S1 和 S2 存在,则输出 −1。
输入样例:
abcd123ab888efghij45ef67kl,ab,ef
输出样例:
18
AC代码
#include<iostream>
using namespace std;
int main()
{
string s,s1,s2;
char c;
while(cin>>c,c!=',')
{
s+=c;
}
while(cin>>c,c!=',')
{
s1+=c;
}
while(cin>>c)
{
s2+=c;
}
if(s.size()< s1.size()||s.size()<s2.size())
{
puts("-1");
}
else
{
int l=0;
while(l+s1.size()<=s.size())
{
int k=0;
while(k<s1.size())
{
if(s[l+k]!=s1[k])
{
break;
}
else
k++;
}
if(k==s1.size())
break;
else
l++;
}
int r = s.size() - s2.size();
while (r >= 0)
{
int k = 0;
while (k < s2.size())
{
if (s[r + k] != s2[k]) break;
k ++ ;
}
if (k == s2.size()) break;
r -- ;
}
l += s1.size() - 1;
if (l >= r) puts("-1");
else
printf("%d\n", r - l - 1);
}
return 0;
}
20.最长公共字符串后缀
题目(还是有点难)
给出若干个字符串,输出这些字符串的最长公共后缀。
输入格式
由若干组输入组成。
每组输入的第一行是一个整数 N。
N 为 0 时表示输入结束,否则后面会继续有 N 行输入,每行是一个字符串(字符串内不含空白符)。
每个字符串的长度不超过 200。
输出格式
共一行,为 N 个字符串的最长公共后缀(可能为空)。
数据范围
1≤N≤200
输入样例:
3
baba
aba
cba
2
aa
cc
2
aa
a
0
输出样例:
ba
a
AC代码
#include <iostream>
using namespace std;
const int N = 200;
int n;
string str[N];
int main()
{
while (cin >> n, n)
{
int len = 1000;
for (int i = 0; i < n; i ++ )
{
cin >> str[i];
if (len > str[i].size()) len = str[i].size();
}
while (len)
{
bool success = true;
for (int i = 1; i < n; i ++ )
{
bool is_same = true;
for (int j = 1; j <= len; j ++ )
if (str[0][str[0].size() - j] != str[i][str[i].size() - j])
{
is_same = false;
break;
}
if (!is_same)
{
success = false;
break;
}
}
if (success)
{
break;
}
else
len -- ;
}
cout << str[0].substr(str[0].size() - len) << endl;
}
return 0;
}