字符串的常用函数及字符串问题

1.去重

#include<stdio.h>
#include<string.h>
int main()
{
    int visited[26]={0},k=0;
    char arr[100],brr[100];
    scanf("%s",arr);
    for(int i=0;i<strlen(arr);i++)
    {
        if(visited[arr[i]-'a']==0)
        {
            brr[k++]=arr[i];
            visited[arr[i]-'a']=1;
        }
    }
    printf("%s",brr);
    return 0;
}

2.反转

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char arr[100];
    scanf("%s",arr);
    reverse(arr+2,arr+7);
    printf("%s",arr);
    return 0;
}

测试:

输入:  helloworld

输出:  heowollrld

3.find

7-108 吃火锅 (15 分)

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    string s;
    int cnt=0;
    vector<int> v;
    while(getline(cin, s)&&s != ".")
    {
        cnt++;
        int pos=s.find("chi1 huo3 guo1",0);//从下标为0的位置查找该字符串,返回首次出现该字符串的首位置,若没有找到,则返回-1
        if(pos!=-1) v.push_back(cnt);
    }
    cout<<cnt<<endl;
    if(v.size()==0) cout<<"-_-#";
    else cout<<v[0]<<" "<<v.size();
    return 0;
}

4.索引

适用于字符数组:

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    char s1[110],s2[110];
    scanf("%s",s1);
    strncpy(s2,s1+2,3);//将s1的3到5位置索引到s2
    cout<<s2<<endl;
    return 0;
}

测试样例:

输入:
abcdefg

输出:
cde

适用于字符串:

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    string s1;
    cin>>s1;
    string s2=s1.substr(2,5);//从2开始,长度为5
    cout<<s2<<endl;
}

5.字符型转整型

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    char s[10];
    cin>>s;
    cout<<3*atoi(s)<<endl;//atoi()字符型转整型
    return 0;
}

6.count

#include<iostream>
#include<algorithm>//注意count需要引用这个头文件
using namespace std;

int main()
{
    string s;
    cin>>s;
    int num=count(s.begin(),s.end(),'a');//统计字符串s中a出现的个数,注意:只能统计单个字符
    cout<<num<<endl;
    return 0;
}

7.插入

#include<iostream>
using namespace std;

int main()
{
    string s;
    cin>>s;
    s.push_back('a');//在字符串尾部插入一个字符
    s.insert(s.begin()+1,'b');//在指定位置前插入一个字符
    cout<<s<<endl;
    return 0;
}

8.拼接

#include<iostream>
using namespace std;

int main()
{
    string s1,s2;
    cin>>s1>>s2;
    s1.append(s2);//或s1.append("内容");
    cout<<s1<<endl;
    s2+=s1;
    cout<<s2<<endl;
    return 0;
}

9.删除

#include<iostream>
using namespace std;

int main()
{
    string s1,s2;
    cin>>s1;
    s1.erase(s1.begin()+1,s1.end()-2);
    cout<<s1<<endl;

    cin>>s2;
    s2.erase(3,5);//从第三个字符开始,删除5个
    cout<<s2<<endl;
    return 0;
}

10.替换

#include<iostream>
using namespace std;

int main()
{
    string s1,s2,s3;

    cin>>s1;
    s1.replace(1,2,3,'*');//将当前字符串从pos索引开始的n个字符,替换成m个字符c
    cout<<s1<<endl;

    cin>>s2;
    s2.replace(2,4,"hello!");//从第二个字符开始,长度为4
    cout<<s2<<endl;

    cin>>s3;
    s3.replace(s3.begin(),s3.begin()+5,"dp");
    cout<<s3<<endl;
    return 0;
}

11.排序

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    string s;
    cin>>s;
    sort(s.begin(),s.end());
    cout<<s<<endl;
    return 0;
}

12.isalnum

判断一个字符是否是字母或者十进制数字,若为字母或者数字,则返回True(非0值),否者返回False(0)

13.L1-8 估值一亿的AI核心代码 (20 分)

在这里插入图片描述

输入:
6
Hello ?
 Good to chat   with you
can   you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know

输出:
Hello ?
AI: hello!
 Good to chat   with you
AI: good to chat with you
can   you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    int n;
    cin >> n;
    getchar();
    while (n--)
    {
        string s;
        getline(cin, s);
        cout << s << endl;

        while (s[0] == ' ')	s.erase(s.begin());//删除行首空格
        while (s[s.length() - 1] == ' ') s.erase(s.end() - 1);//删除行尾空格

        for (int i = 0; i<s.length(); i++)
        {
            if (s[i] == ' ')
            {
                while (s[i + 1] == ' ')	s.erase(s.begin() + i + 1);//删除多余空格
                if (!isalnum(s[i+1])) s.erase(s.begin() + i);//删除标点符号前的空格
            }
        }

        for (int i = 0; i<s.length(); i++)
            if (s[i] >= 'A'&&s[i] <= 'Z'&&s[i] != 'I') s[i] -= 'A' - 'a';//大写换小写

        for (int beg = 0;; beg++)
        {
            beg = s.find("can you",beg);//从第beg个位置开始找
            if (beg == -1)break;
            if((!beg||!isalnum(s[beg-1]))&&(beg+7==s.length()||!isalnum(s[beg+7])))//((!beg&&!isalnum(s[beg+7]))||(!isalnum(s[beg-1])&&!isalnum(s[beg+7]))||(beg+7==s.length()&&!isalnum(s[beg-1])))
                s.replace(beg,7,"A can");
        }
        for (int beg = 0;; beg++)
        {
            beg = s.find("could you", beg);
            if (beg == -1)break;
            if ((!beg||!isalnum(s[beg-1]))&&(beg+9==s.length()||!isalnum(s[beg+9])))
                s.replace(beg,9,"A could");
        }
        for (int beg = 0;; beg++)
        {
            beg = s.find("I", beg);
            if (beg == -1)break;
            if ((!beg||!isalnum(s[beg-1]))&&(beg+1==s.length()||!isalnum(s[beg+1])))
                s.replace(beg,1,"you");
        }
        for (int beg = 0;; beg++)
        {
            beg = s.find("me", beg);
            if (beg == -1)break;
            if ((!beg||!isalnum(s[beg-1]))&&(beg+2==s.length()||!isalnum(s[beg+2])))
                s.replace(beg,2,"you");
        }
        for (int i=0; i<s.length(); i++)
        {
            if (s[i] == '?')s[i] = '!';
            if (s[i] == 'A')s[i] = 'I';
        }
        cout << "AI: " << s << endl;
    }
    return 0;
}

14.凯撒加密算法

测试样例:

输入:
1
abcdz
123
输出:
bdfeb

题目描述:
凯撒加密算法是有一个字符串和一个数字加密串,我们不断书写数字加密串使之与字符串对齐,然后对应位相加之后即可得到加密的结果。例如,如果给定的字符串是abcdz,而加密串是123的话,那么我们有: abcdz+12312=bdfeb
现在给定字符串s,数字串n,问用n对s进行k次加密操作之后得到的结果是多少。
代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long k;
    char arr[100010],brr[100010],crr[100010];
    scanf("%lld",&k);
    scanf("%s",arr);
    scanf("%s",brr);
    int len1=strlen(arr),len2=strlen(brr);
    for(int i=0;i<len1;i++)
    {
        long long s=(k*(brr[i%len2]-'0'))%26;
        if('z'-arr[i]>=s)
            crr[i]=arr[i]+s;
        else
            crr[i]='a'-'z'+arr[i]+s-1;
    }
    printf("%s",crr);
    return 0;
}

15. 最短前缀

在这里插入图片描述

输入:
carbohydrate
cart
carburetor
caramel
caribou
carbonic
cartilage
carbon
carriage
carton
car
carbonate
输出:
carbohydrate carboh
cart cart
carburetor carbu
caramel cara
caribou cari
carbonic carboni
cartilage carti
carbon carbon
carriage carr
carton carto
car car
carbonate carbona
#include<iostream>
#include<cstring>
using namespace std;

string s[1010];
int k;

int main()
{
    while(cin>>s[k++]);
    for(int i=0;i<k;i++)//时间复杂度:20×1000×1000
    {
        int l=s[i].size();
        for(int j=1;j<=l;j++)
        {
            int cnt=0;
            for(int m=0;m<k;m++)
            {
                if(s[m].substr(0,j)==s[i].substr(0,j)) cnt++;
            }
            if(j==l) cout<<s[i]<<" "<<s[i].substr(0,j)<<endl;
            else if(cnt==1)
            {
                cout<<s[i]<<" "<<s[i].substr(0,j)<<endl;
                break;
            }
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢nn

心动不如行动,感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值