PTA7-29 删除字符串中的子串

题目链接:删除字符串中的子串

题目描述

输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。

输入格式:
输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。

输出格式:
在一行中输出删除字符串S1中出现的所有子串S2后的结果字符串。

输入样例:
Tomcat is a male ccatat
cat
输出样例:
Tom is a male

题意分析

这道题还是比较容易懂的,就是输入两个字符串S1,S2,将S1中出现的S2全部删掉即可,需要注意的是有可能删掉一个S2之后会出现一个新的S2(如样例),此时就需要再删除一次。因为输入是有空格的,所以不能直接cin。

代码实现

#include<iostream>
#include<string>
using namespace std;
int main()
{
    string a,b;
    getline(cin,a);
    getline(cin,b);
    while(a.find(b,0)!=-1)
    {
        int p=a.find(b,0);
        a.erase(p,b.size());
    }
    cout<<a<<endl;
    return 0;
}

知识(补)

不搜这道题都不知道string类型中也有这么多方便好用的函数,特此把这些常用的函数在我的博客总结一下,方便自己记忆。

赋值

将字符串2赋值给字符串1:

  1. 字符串1 = 字符串2;
  2. 字符串1.assign(字符串2);
    string s1="Drew",s2;
    s2=s1;
    cout<<s2<<" ";
    s2="is handsome";
    s1.assign(s2);
    cout<<s1;
    //运行结果:Drew is handsome
    
    将字符串2从第m个字符开始的n个字符赋值给字符串1:
    字符串1.assign(字符串2, m, n);
    string s1="Uncle ",s2="drew";
    s1.assign(s2,1,3);
    cout<<s1<<endl;
    cout<<s2;
    //运行结果:rew
    //         drew
    

长度

返回字符串长度:

  1. 字符串1.length();
  2. 字符串1.size();
    string s1="Uncle",s2="drew";
    cout<<s1.length()<<" "<<s2.size();
    //运行结果:5 4
    

比较

">", "<", "==", ">=", "<="均可以用于字符串比较。
这个不需要例子了。直接比较就可以

查找

在字符串1中从第m个字符开始查找字符串2,返回第一次出现的首字母位置,失败时返回-1:
字符串1.find(字符串2, m);

string s1="Uncle_drew!Uncle_drew!Uncle_drew!",s2="drew";
int pos=-1;
while(1)
{
    pos = s1.find(s2,pos+1);
    if(pos==-1) break;
    cout<<pos<<" ";
}
//运行结果:6 17 28

在字符串1中从第m个字符开始从后向前查找字符串2,返回第一次出现的首字母位置,失败时返回-1:
字符串1.rfind(字符串2, m);

string s1="Uncle_drew!Uncle_drew!Uncle_drew!",s2="drew";
int pos=s1.size();
while(pos)
{
    pos = s1.rfind(s2,pos-1);
    if(pos<0) break;
    cout<<pos<<" ";
}
//运行结果:28 17 6

连接

将字符串2接到字符串1尾部:

  1. 字符串1.append(字符串2); //字符不可
  2. 字符串1 += 字符串2; //字符亦可
    string s1="Uncle_",s2="drew is handsome";
    string s3=s1,s4=s2;
    s1.append(s2);
    cout<<s1<<"\t";
    s3+=s4;
    cout<<s3;
    //运行结果:Uncle_drew is handsome  Uncle_drew is handsome
    

将字符串2从第m个字符开始的n个字符接到字符串1尾部:
字符串1.append(字符串2, m, n);

string s1="Uncle",s2="drew is handsome";
s1.append(s2,4,15);
cout<<s1;
//运行结果:Uncle is handsome

交换

字符串1.swap(字符串2);

string s2="Uncle ",s1="drew is handsome";
s1.swap(s2);
cout<<s1<<"\t"<<s2;
//运行结果:Uncle   drew is handsome

子串

返回字符串1从第m个字符开始的n个字符所组成的子串:
字符串1.substr(m, n);

string s1="Uncle ",s2="drew is handsome";
string s3,s4;
s3=s1+s2;
s4=s3.substr(6,20);
cout<<s3<<"的一个子串:    "<<s4;
//运行结果:Uncle drew is handsome的一个子串:    drew is handsome

替换

在字符串1中删除从m开始的n个字符,然后在m处插入串s2
字符串1.replace(m, n, s2);

string s1="Uncle ",s2="drew is not handsome";
string s3="so",s4="not";
int pos=s2.find(s4);
s2.replace(pos,s4.size(),s3);
cout<<s2;
//运行结果:drew is so handsome

插入

在字符串1的第m个字符处插入字符串2:
字符串1.insert(m, 字符串2);

string s1="Uncle ",s2="drew is handsome";
string s3="so ";
s2.insert(s2.find("handsome",0),s3);
cout<<s2;
//运行结果:drew is so handsome

删除

从字符串1的第m个字符开始,删除n个字符:
字符串1.erase(m, n);

string s1="Uncle ",s2="drew is not handsome";
s2.erase(s2.find("not"),4);
cout<<s2;
//运行结果:drew is handsome

c语言中的string.h中也有许多对字符数组操作的函数,先记着吧。