C/C++基础知识——字符串

目录

 

1.字符串长度

知识点:s.size();用法

2. 字符串中的数字个数

知识点:字符串中字符的遍历:for(auto c:s)

3.循环相克令

4.替换字符

知识点:getline(cin,s);可以输入包括空格的字符串

5. 字符串插入

知识点:str.insert(idx+1,substr);字符串的插入

6.只出现一次的字符

 7.字符串匹配

 知识点:for(int i=0;i();i++)字符串中每个字符的遍历<>

 8.忽略大小写比较字符串大小

知识点:strcmp(a.c_str(),b.c_str())字符串比较函数

 知识点:fgets(a,100,stdin);无法去除‘\n’

 9.去掉多余的空格

知识点:string  a,b;    a+=b;字符串可以实现相加减

知识点:cin可以自己去除空格

 10.信息加密

知识点: s=(s-'A'+1)%26+'A'   位数取余控制循环

11.输出字符串

知识点: 字符串中字符ASCII 值相加后转换为字符

12.单词替换

知识点:#include中 stringstream ssin(s);的使用    ssin相当于cin 可直接输入字符串,将字符串变为字符流

13.字符串中最长的连续出现的字符

知识点:/***第一类指针做法***/

 14.最长单词

知识点:s.back()与s.pop_back();的用法

 15.倒排单词

知识点: string s[1000]   s中存放的是字符串

16.字符串移位包含问题

知识点:去掉某个位置的字符:a.substr(1)   去掉了第一个位置的字符,循环暴力枚举

 17.字符串最大跨距

知识点: 过滤,读入字符串a,b,c      字符串的遍历与判断

知识点:find大法     

s.find();    // 在字符串s上从前往后找        s.rfind();   // 从后往前

 s.find(s1)的返回值为所查找的子串的第一个字符的位置,找不到返回 -1


 

1.字符串长度

知识点:s.size();用法

给定一行长度不超过 100的非空字符串,请你求出它的具体长度。

输入格式

输入一行,表示一个字符串。注意字符串中可能包含空格。

输出格式

输出一个整数,表示它的长度。

数据范围

1≤字符串长度≤100
字符串末尾无回车

输入样例:

I love Beijing.

输出样例:

15
#include

using namespace std;

int main()
{
    string c;
    getline(cin,c);
    cout<

2. 字符串中的数字个数

知识点:字符串中字符的遍历:for(auto c:s)

输入一行字符,长度不超过 100,请你统计一下其中的数字字符的个数。

输入格式

输入一行字符。注意其中可能包含空格。

输出格式

输出一个整数,表示字数字字符的个数。

输入样例:

I am 18 years old this year.

输出样例:

2

 

#include

using namespace std;

int main()
{
    string s;
    int sum=0;
    getline(cin,s);
    for(auto c:s)
    if(c<='9'&&c>='0')sum++;
    cout<

 

给定一个字符串,在字符串的每个字符之间都加一个空格。

输出修改后的新字符串。

输入格式

共一行,包含一个字符串。注意字符串中可能包含空格。

输出格式

输出增加空格后的字符串。

数据范围

1≤字符串长度≤100

输入样例:

test case

输出样例:

t e s t   c a s e
#include

using namespace std;

int main()
{
    string s;
    getline(cin,s);
    for(auto c:s)
    cout<

 

3.循环相克令

循环相克令是一个两人玩的小游戏。

令词为“猎人、狗熊、枪”,两人同时说出令词,同时做出一个动作——猎人的动作是双手叉腰;狗熊的动作是双手搭在胸前;枪的动作是双手举起呈手枪状。

双方以此动作判定输赢,猎人赢枪、枪赢狗熊、狗熊赢猎人,动作相同则视为平局。

现在给定你一系列的动作组合,请你判断游戏结果。

输入格式

第一行包含整数 TT,表示共有 TT 组测试数据。

接下来 TT 行,每行包含两个字符串,表示一局游戏中两人做出的动作,字符串为 HunterBearGun 中的一个,这三个单词分别代表猎人,狗熊和枪。

输出格式

如果第一个玩家赢了,则输出 Player1

如果第二个玩家赢了,则输出 Player2

如果平局,则输出 Tie

数据范围

1≤N≤100

输入样例

3
Hunter Gun
Bear Bear
Hunter Bear

输出样例

Player1
Tie
Player2

 

#include

using namespace std;

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string n,m;
        int x,y;
        cin>>n>>m;
        if(n=="Hunter")x=0;
        else if(n=="Bear")x=1;
        else if(n=="Gun") x=2;
        if(m=="Hunter")y=0;
        else if(m=="Bear")y=1;
        else if(m=="Gun")y=2;
        if(x==y)cout<<"Tie"<

4.替换字符

知识点:getline(cin,s);可以输入包括空格的字符串

给定一个由大小写字母构成的字符串。

把该字符串中特定的字符全部用字符 # 替换。

请你输出替换后的字符串。

输入格式

输入共两行。

第一行包含一个长度不超过 3030 的字符串。

第二行包含一个字符,表示要替换掉的特定字符。

输出格式

输出共一行,为替换后的字符串。

输入样例:

hello
l

输出样例:

he##o

 

#include

using namespace std;

int main()
{
    string s;
    getline(cin,s);
    char x;
    cin>>x;
    for(auto c:s)
    {
        if(c==x)
        c='#';
        cout<

5. 字符串插入

知识点:str.insert(idx+1,substr);字符串的插入

 

有两个不包含空白字符的字符串 strstr 和 substrsubstr,strstr 的字符个数不超过 10,substrsubstr 的字符个数为 3。(字符个数不包括字符串结尾处的 \0。)

将 substrsubstr 插入到 strstr 中 ASCII 码最大的那个字符后面,若有多个最大则只考虑第一个。

输入格式

输入包括若干行,每一行为一组测试数据,格式为

str substr

输出格式

对于每一组测试数据,输出插入之后的字符串。

输入样例:

abcab eee
12343 555

输出样例:

abceeeab
12345553
#include

using namespace std;

int main()
{
    string str,substr;
    while(cin>>str>>substr)
    {
        int idx=0;
        for(int i=0;istr[idx])
            {
                idx=i;
            }
        }
        str.insert(idx+1,substr);
        
        cout<

6.只出现一次的字符

给你一个只包含小写字母的字符串。

请你判断是否存在只在字符串中出现过一次的字符。

如果存在,则输出满足条件的字符中位置最靠前的那个。

如果没有,输出 no

输入格式

共一行,包含一个由小写字母构成的字符串。

数据保证字符串的长度不超过 100000。

输出格式

输出满足条件的第一个字符。

如果没有,则输出 no

输入样例:

abceabcd

输出样例:

e
#include
#include
using namespace std;

int main()
{
    string s;
    cin>>s;
    int leap=0;
    int x[1000];
    for(auto i:s)
    {
        x[i]++;
    }
    for(auto i:s)
    {
        if(x[i]==1)
        {
            cout<

 7.字符串匹配

 知识点:for(int i=0;i

给定两个长度相同的字符串 a 和字符串 b。

如果在某个位置 i上,满足字符串 a上的字符 a[i] 和字符串 b上的字符 b[i]相同,那么这个位置上的字符就是匹配的。

如果两个字符串的匹配位置的数量与字符串总长度的比值大于或等于 k,则称两个字符串是匹配的。

现在请你判断给定的两个字符串是否匹配。

输入格式

第一行包含一个浮点数 k,第二行包含字符串 a,第三行包含字符串 b。

输入的字符串中不包含空格。

输出格式

如果两个字符串匹配,则输出 yes

否则,输出 no

数据范围

0≤k≤10,
字符串的长度不超过 100。

输入样例:

0.4
abcde
xbacd

输出样例:

no
#include

using namespace std;

int main()
{
    double x;
    string a,b;
    cin>>x>>a>>b;
    double sum=0;
    for(int i=0;i=x)cout<<"yes"<

 8.忽略大小写比较字符串大小

知识点:strcmp(a.c_str(),b.c_str())字符串比较函数

一般我们用 strcmp 可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按 ASCII 码值大小比较),直到出现不同的字符或遇到 \0 为止。

如果全部字符都相同,则认为相同;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。

但在有些时候,我们比较字符串的大小时,希望忽略字母的大小,例如 Hello 和 hello 在忽略字母大小写时是相等的。

请写一个程序,实现对两个字符串进行忽略字母大小写的大小比较。

输入格式

输入为两行,每行一个字符串,共两个字符串。注意字符串中可能包含空格。

数据保证每个字符串的长度都不超过 8080。

输出格式

如果第一个字符串比第二个字符串小,输出一个字符 <

如果第一个字符串比第二个字符串大,输出一个字符 >

如果两个字符串相等,输出一个字符 =

输入样例:

Hello
hello

输出样例:

=

 

#include
#include
#include

using namespace std;
int main()
{
    string a,b;
    getline(cin,a);
    getline(cin,b);
    for(int i=0;i='A')
            a[i]+=32;
    for(int i=0;i='A')
            b[i]+=32;
    int t=strcmp(a.c_str(),b.c_str());
    if(t==0)puts("=");
    else if(t<0)puts("<");
    else puts(">");
    return 0;
}

 知识点:fgets(a,100,stdin);无法去除‘\n’

#include
#include
#include

using namespace std;

int main()
{
    string a,b;
    fgets(a,100,stdin);
    fgets(b,100,stdin);
    //需要手动去除'\n'
    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;
}

 9.去掉多余的空格

知识点:string  a,b;    a+=b;字符串可以实现相加减

输入一个字符串,字符串中可能包含多个连续的空格,请将多余的空格去掉,只留下一个空格。

输入格式

共一行,包含一个字符串。

输出格式

输出去掉多余空格后的字符串,占一行。

数据范围

输入字符串的长度不超过 200。
保证输入字符串的开头和结尾没有空格。

输入样例:

Hello      world.This is    c language.

输出样例:

Hello world.This is c language.
#include

using namespace std;

int main()
{
    string x;
    getline(cin,x);
    string r;
    for(int i=0;i

知识点:cin可以自己去除空格

#include

using namespace std;
//最简单得做法
int main()
{
    string x;
    while(cin>>x)
    {
        cout<

 10.信息加密

知识点: s=(s-'A'+1)%26+'A'   位数取余控制循环

在传输信息的过程中,为了保证信息的安全,我们需要对原信息进行加密处理,形成加密信息,从而使得信息内容不会被监听者窃取。

现在给定一个字符串,对其进行加密处理。

加密的规则如下:

  1. 字符串中的小写字母,aa 加密为 bb,bb 加密为 cc,…,yy 加密为 zz,zz 加密为 aa。
  2. 字符串中的大写字母,AA 加密为 BB,BB 加密为 CC,…,YY 加密为 ZZ,ZZ 加密为 AA。
  3. 字符串中的其他字符,不作处理。

请你输出加密后的字符串。

输入格式

共一行,包含一个字符串。注意字符串中可能包含空格。

输出格式

输出加密后的字符串。

数据范围

输入字符串的长度不超过 100。

输入样例:

Hello! How are you!

输出样例:

Ifmmp! Ipx bsf zpv!
#include

using namespace std;

int main()
{
    string c;
    getline(cin,c);
    for(auto &s:c)
        if(s<='z'&&s>='a')
        {
            s=(s-'a'+1)%26+'a';
        }
        else if(s<='Z'&&s>='A')
        {
            s=(s-'A'+1)%26+'A';
        } 
        cout<

11.输出字符串

知识点: 字符串中字符ASCII 值相加后转换为字符

给定一个字符串 a,请你按照下面的要求输出字符串 b。

给定字符串 a 的第一个字符的 ASCII 值加第二个字符的 ASCII 值,得到 b 的第一个字符;

给定字符串 a 的第二个字符的 ASCII 值加第三个字符的 ASCII 值,得到 b 的第二个字符;

给定字符串 a 的倒数第二个字符的 ASCII 值加最后一个字符的 ASCII 值,得到 b 的倒数第二个字符;

给定字符串 a 的最后一个字符的 ASCII 值加第一个字符的 ASCII 值,得到 b 的最后一个字符。

输入格式

输入共一行,包含字符串 a。注意字符串中可能包含空格。

数据保证字符串内的字符的 ASCII 值均不超过 6363。

输出格式

输出共一行,包含字符串 b。

数据范围

2≤a的长度≤100

输入样例:

1 2 3

输出样例:

QRRSd
#include

using namespace std;

int main()
{
    string s;
    getline(cin,s);
    for(int i=0;i

12.单词替换

知识点:#include中 stringstream ssin(s);的使用    ssin相当于cin 可直接输入字符串,将字符串变为字符流

输入一个字符串,以回车结束(字符串长度不超过 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

 

#include
#include

using namespace std;

int main()
{
    string s;
    string a,b;
    getline(cin,s);
    cin>>a>>b;
    stringstream ssin(s);
    string str;
    while(ssin>>str)
    {
        if(str==a)cout<

13.字符串中最长的连续出现的字符

知识点:/***第一类指针做法***/

求一个字符串中最长的连续出现的字符,输出该字符及其出现次数,字符串中无空白字符(空格、回车和 tab),如果这样的字符不止一个,则输出第一个。

输入格式

第一行输入整数 N,表示测试数据的组数。

每组数据占一行,包含一个不含空白字符的字符串,字符串长度不超过 200。

输出格式

共一行,输出最长的连续出现的字符及其出现次数,中间用空格隔开。

输入样例:

2
aaaaabbbbbcccccccdddddddddd
abcdefghigk

输出样例:

d 10
a 1
#include

using namespace std;

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string s;
        cin>>s;
        int m=0;
        char c;
        for(int i=0;im)m=j-i,c=s[i];
            i=j-1;
        }
        cout<

 14.最长单词

知识点:s.back()与s.pop_back();的用法

一个以 . 结尾的简单英文句子,单词之间用空格分隔,没有缩写形式和其它特殊形式,求句子中的最长单词。

输入格式

输入一行字符串,表示这个简单英文句子,长度不超过 500。

输出格式

该句子中最长的单词。如果多于一个,则输出第一个。

输入样例:

I am a student of Peking University.

输出样例:

University
#include

using namespace std;

int main()
{
    string s,r;
    while(cin>>s)
    {
        if(s.back()=='.')s.pop_back();
        if(s.size()>r.size())r=s;
        
    }
    cout<

 15.倒排单词

知识点: string s[1000]   s中存放的是字符串

编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。

输入格式

输入为一个字符串(字符串长度至多为 100)。

输出格式

输出为按要求排序后的字符串。

输入样例:

I am a student

输出样例:

student a am I

 

#include

using namespace std;

int main()
{
    string s[1000];
    int i=1;
    while(cin>>s[i])i++;
    for(int j=i-1;j>=1;j--)
    cout<

16.字符串移位包含问题

知识点:去掉某个位置的字符:a.substr(1)   去掉了第一个位置的字符,循环暴力枚举

对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。

给定两个字符串 s1 和 s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。

例如 CDAA 是由 AABCD 两次移位后产生的新串 BCDAA 的子串,而 ABCD 与 ACBD 则不能通过多次移位来得到其中一个字符串是新串的子串。

输入格式

共一行,包含两个字符串,中间由单个空格隔开。

字符串只包含字母和数字,长度不超过 30。

输出格式

如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出 true,否则输出 false

输入样例:

AABCD CDAA

输出样例:

true
#include

using namespace std;

int main()
{
    string a,b;
    cin>>a>>b;
    if(a.size()

 17.字符串最大跨距

知识点: 过滤,读入字符串a,b,c      字符串的遍历与判断

有三个字符串 S,S1,S2,其中,S 长度不超过 300,S1和 S2 的长度不超过 10。

现在,我们想要检测 S1 和 S2是否同时在 SS 中出现,且 S1 位于 S2的左边,并在 S 中互不交叉(即,S1的右边界点在 S2 的左边界点的左侧)。

计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2 的起始点与最左边的 S1 的终止点之间的字符数目)。

如果没有满足条件的 S1,S2 存在,则输出 −1。

例如,S=S= abcd123ab888efghij45ef67kl, S1= ab, S2= ef,其中,S1 在 S中出现了 2 次,S2也在 S 中出现了 2 次,最大跨距为:18。

输入格式

输入共一行,包含三个字符串 S,S1,S2,字符串之间用逗号隔开。

数据保证三个字符串中不含空格和逗号。

输出格式

输出一个整数,表示最大跨距。

如果没有满足条件的 S1 和 S2存在,则输出 −1。

输入样例:

abcd123ab888efghij45ef67kl,ab,ef

输出样例:

18
#include

using namespace std;

int main()
{
    string s,s1,s2;
    char c;
    //过滤,读入字符串s,s1,s2
    while(cin>>c,c!=',')s+=c;
    while(cin>>c,c!=',')s1+=c;
    while(cin>>c)s2+=c;
     //判断字符串s的长度是否包含了字符串s1,s2
    if(s.size()=0;r--) //一直找到字符串s的最左侧
        {
            int k=0;
            for(;kl)cout<

知识点:find大法     

s.find();    // 在字符串s上从前往后找        s.rfind();   // 从后往前

 s.find(s1)的返回值为所查找的子串的第一个字符的位置,找不到返回 -1

#include  

using namespace std;

int main()
{
    string s, s1, s2, a;
    getline(cin, a);

    int f1, f2;                      // 两个','的位置
    f1 = a.find(',');
    f2 = a.rfind(',');
    s = a.substr(0, f1);
    s1 = a.substr(f1 + 1, f2 - f1 - 1);
    s2 = a.substr(f2 + 1);


    int l, r;
    l = s.find(s1);                   // 在字符串s上从左往右找s1
    r = s.rfind(s2);                  // 在字符串s上从右往左找s2

    if (l == -1 || r == -1)           // s1 或 s2 不在 s 上
    { 
        cout << "-1";
        return 0;
    }

    l = s.find(s1)  + s1.size() - 1;   // l为s1最右面的下标

    if ( l >= r )                      // s1 s2 交叉
        cout << "-1";
    else cout << r - l - 1;

    return 0;
}

 

 

你可能感兴趣的:(c++,算法,开发语言)