【上机训练】字符串

字符串的定义

#include<bits/stdc++.h>	//万能头文件,但不是所有oj都能用

#include<string>	//引入

using namespace std;

int main(){
    
    //字符串的定义

    string s0="initial string";     //直接定义:initial string
    string s1;
    string s2(s0);                  //将s0复制到s2:initial string
    string s3(s0,8,3);              //从s0的第八个字符开始,输出三个字符:str
    string s4("initial string");    //使用函数定义效果同直接定义:initial string
    string s5("initial string",5);  //取前五个字符:initi
    string s6(10,'x');              //构造10个重复的x:xxxxxxxxxx

    cout<<"s0:"<<s0<<endl;
    cout<<"s1:"<<s1<<endl;
    cout<<"s2:"<<s2<<endl;
    cout<<"s3:"<<s3<<endl;
    cout<<"s4:"<<s4<<endl;
    cout<<"s5:"<<s5<<endl;
    cout<<"s6:"<<s6<<endl;
    return 0;
}

字符串的操作

#include<bits/stdc++.h>

#include<string>

using namespace std;

int main(){

    //字符串的定义

    string str="hello world";
    for(int i=0;i<str.size();++i){
        cout<<str[i];                       //加 <<endl 是换行
    }
    cout<<endl<<"第七个字符是:"<<str[6];   //能像数组一样任取值
                                            //前面加 <<endl 能与上一个输出换行
    string str1="to be question";
    string str2="that is a";
    string str3="or not world";
    string str4;

    str4.insert(0,str1);        //从0开始插入str1
    str4.insert(6,str3,0,7);    //从6开始插入str3的0~7字符
    str4.insert(13,"to be");
    str4.insert(19,str2);
    cout<<endl<<"插入:"<<str4;

    //str4.erase(19);             //19后面的全不要了
    str4.erase(0,9);           //删除0~9
    cout<<endl<<"删除:"<<str4;

    str4.clear();               //清空字符串
    cout<<endl<<"清空:"<<str4;

    return 0;
}

字符串的运算

#include<bits/stdc++.h>

#include<string>

using namespace std;

int main(){

    string str1="to be question";
    string str2="that is a";
    string str3="or not world";
    string str4;

    string str=str1+";";        //字符串的各种拼接
    str = str+str2+";";
    str += str3;
    cout<<str<<endl;

    str1="ab";                  //字符串比较,按字典比较
    str2="abc";
    str3="bba";
    cout<< (str1 <= str2) <<endl;   //输出1
    cout<< (str1 != str2) <<endl;   //1
    cout<< (str2 < str1) <<endl;    //0
    return 0;
}

字符串的函数

#include<bits/stdc++.h>

#include<string>

using namespace std;

int main(){

    string str1="to be question to";
    int lenght=str1.size();
    cout<<lenght<<endl;

    int position1=str1.find("to");      //找子串,返回子串的起始下标,默认从第0个开始找
    int position2=str1.find("to",9);    //找子串,从第9个开始找
    cout<<position1<<endl<<position2<<endl;

    position1=str1.find("b");      //找字符
    position2=str1.find("o",9);    //找字符,从第9个开始找
    cout<<position1<<endl<<position2<<endl;

    position2=str1.find("x",9);    //找字符,没有返回 -1
    cout<<position1<<endl<<position2<<endl;

    string str2=str1.substr(5);    //返回从5开始的子串
    string str3=str1.substr(4,6);    //返回4~6的子串
    cout<<str2<<endl<<str3;

    return 0;
}

遍历

  1. 特殊乘法

    题目描述:

    写个算法,对2个小于1000000000的输入,求结果。 特殊乘法举例:123 * 45 = 14 +15 +24 +25 +34+35

    输入

    两个小于1000000000的数

    输出

    输入可能有多组数据,对于每一组数据,输出Input中的两个数按照题目要求的方法进行运算后得到的结果。

    样例输入

    123 45

    样例输出

    54

    解法思路

    代码

#include<bits/stdc++.h>

#include <string>   //c++,string类头文件
#include <string.h> //区分:c中的string头文件

using namespace std;

int main(){

    string str1;
    string str2;

    while(cin>>str1>>str2){     //有多组输入
        int answer=0;           
        for(int i=0;i<str1.size();++i){            //对str1遍历
            for(int j=0;j<str2.size();++j){         //对str2遍历
                answer += (str1[i]-'0') * (str2[j]-'0');    //str1[i]是数字字符的阿斯克码,-'0'就得到它的int值
            }
        }
        cout<<answer<<endl;
    }
    return 0;
}

加密

  1. 简单密码

    题目描述:

    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 你的任务是对给定的密文进行解密得到明文。 你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。

    输入

    输入中的测试数据不超过100组。每组数据都有如下的形式,而且各组测试数据之间没有空白的行。
    一组测试数据包括三部分:

    1. 起始行 - 一行,包括字符串 “START”
    2. 密文 - 一行,给出密文,密文不为空,而且其中的字符数不超过200
    3. 结束行 - 一行,包括字符串 “END”
      在最后一组测试数据之后有一行,包括字符串 “ENDOFINPUT”。

    输出

    对每组数据,都有一行输出,给出密文对应的明文。

    样例输入

    START
    NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX
    END
    START
    N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ
    END
    START
    IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ
    END
    ENDOFINPUT

    样例输出

    IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
    I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME
    DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE

    解法思路

    明文是密文的循环移动
    本题整体向左循环移动了5位:
    即要考虑如何将:(0 1 2 3 4 5…21 22 23 24 25) 变为 (21 22 23 24 25 0 1 … 19 20)
    整体-5,但前5个变成了负数,然后+26 ,再整体取模26

    1. value=看到的字母-‘A’
    2. 实际的字母与‘A’的差(value-5+26)%26
      3.(value-5+26)%26 +‘A’

    代码

#include<bits/stdc++.h>

#include <string>   //c++,string类头文件
#include <string.h> //区分:c中的string头文件

using namespace std;

int main(){

    string str;

    while(getline(cin,str)){        //本题的输入中有空格,如果使用之前的写法cin>>str,读到空格就终止了
                                    //所以要用getline(输入方式,目的)的方式一行行取
        if(str == "ENDOFINPUT"){
            break;
        }
        getline(cin,str);
        for(int i=0;i<str.size();++i){
            if('A'<=str[i]&&str[i]<='Z'){
                str[i]=((str[i]-'A')-5+26)%26+'A';  //对明文中每个字母,换字母的过程
                                                    //如B对应W
                                                    //B-'A'就是B再正常情况下的下标
                                                    //((B-'A')-5+26)%26就是对应字母下标
            }
        }
        cout<<str<<endl;
        getline(cin,str);
    }
    return 0;
}

统计

  1. 统计字符

    题目描述:

    统计一个给定字符串中指定的字符出现的次数。

    输入

    测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过80的字符串。注意这里的字符串包含空格,即空格也可能是要求被统计的字符之一。当读到’#'时输入结束,相应的结果不要输出。

    输出

    对每个测试用例,统计第1行中字符串的每个字符在第2行字符串中出现的次数,按如下格式输出:
    c0 n0
    c1 n1
    c2 n2

    其中ci是第1行中第i个字符,ni是ci出现的次数。

    样例输入

    I
    THIS IS A TEST
    i ng
    this is a long test string
    》#

    样例输出

    I 2
    i 3
    空格 5
    n 2
    g 2

    解法思路

    代码

#include<bits/stdc++.h>

#include <string>   //c++,string类头文件
#include <string.h> //区分:c中的string头文件

using namespace std;

int countnum[100];      //记录字母在主串中出现的次数

int main(){

    string str1;
    string str2;
    while(getline(cin,str1)){   //接收子串到str1    
        if(str1 == "#"){        //当第一行为#时,跳出
            break;
        }
        
        for(int i=0;i<=sizeof(countnum);++i){   //⭐有多组输入,每组完后countnum要置零
            countnum[i]=0;
        }
        
        getline(cin,str2);                      //接收主串到str2
        for(int i=0;i<str2.size();++i){         //⭐遍历主串,统计每个字符出现的次数
            countnum[str2[i]]++;
        }
        
        for(int i=0;i<str1.size();++i){         //⭐遍历子串,输出字串中字符在countnum中的值
            cout<<str1[i]<<' '<<countnum[str1[i]]<<endl;//字符当int用时等于它的阿斯克码值
        }
    }
    return 0;
}
  1. 分类统计

    题目描述:

    输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数。
    本题包含多组输入。

    输入

    输入一行字符串,可以有空格

    输出

    统计其中英文字符,空格字符,数字字符,其他字符的个数

    样例输入

    1qazxsw23 edcvfr45tgbn hy67uj m,ki89ol.\/;p0-=\][

    样例输出

    26
    3
    10
    12

    解法思路

    代码

#include<bits/stdc++.h>

#include <string>   //c++,string类头文件
#include <string.h> //区分:c中的string头文件

using namespace std;

int main(){

    int num1=0;         //⭐变量一定要赋初值,不然地址有残余数据
    int num2=0;
    int num3=0;
    int num4=0;

    string str;
    while(getline(cin,str)){
        
        num1=0;         //⭐多组输入时一定要将num重置
        num2=0;
        num3=0;
        num4=0; 
    
        for(int i=0;i<str.size();++i){

            if(str[i]>='a'&&str[i]<='z'){
                num1++;
            }else if(str[i]>='0'&&str[i]<='9'){
                num3++;
            }else if(str[i] ==' '){
                num2++;
            }else{
                num4++;
            }
        }
        cout<<num1<<endl<<num2<<endl<<num3<<endl<<num4<<endl;
    }
    return 0;
}

匹配

  1. 字符串匹配

    题目描述:

    输入

    输出

    样例输入

    样例输出

    解法思路

    暴力匹配

    代码

 #include<bits/stdc++.h>

#include <string>  

using namespace std;

int main(){

    string str1;
    string str2;

    getline(cin,str1);
    getline(cin,str2);

    int s;
    int i;
    int j;
    int n=str1.size();
    int m=str2.size();

    for(int s=0;s<n-m+1;++s){   //s为每次结束一轮匹配后,主串开始的点
        i=s;                    //给i,j赋初值  
        j=0;
        for(;j<(m-1);){         //j在子串上移动,不用写++j
            if(str1[i]==str2[j]){
                ++i;             //若相等i,j都后移   
                ++j;
            }else{
                break;           //只要不等就跳出
            }
        }
        if(str1[i]==str2[j]){    //执行到此步只有两种可能,1:成功此时str1[i]==str2[j]
                                                            //2:失败此时不等
            printf("%d ",s);    //此时s就是匹配成功的起点
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值