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

7-29 删除字符串中的子串(20 分)

输入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[0]进行比较,相等的话进行递归查询看是否S2中所有字符都能匹配到,匹配到则删除,这个思路很简单,但没有完全发挥到string的用处,而且还有两个测试点过不去,且分析为玄学。然后我百度了下string相关函数的用法,用find函数进行查找,然后再用erase函数进行删除,最后直接输出S1就行了。

这个是我第一次没有AC的代码—。—

#include<stdio.h>
#include<string>
#include<sstream>
#include<iostream>
using namespace std;
int f(string s1, string s2, int s11, int s22 = 0)        //递归查询之后的字符是否匹配
{
    if (s1[s11] == s2[s22]) return 1 + f(s1, s2, s11 + 1, s22 + 1);
    return 0;
}
int main()
{
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);

    int len = s1.length();                //len用来记录当前S1的长度

    for (int i = 0; i <= len - s2.length(); i++)
    {
        if (s1[i] == s2[0])                //进行匹配
        {
            if (f(s1, s2, i) == s2.length())
            {
                for (int j = i; j < len - s2.length(); j++)
                    s1[j] = s1[j + s2.length()];

                i -= 2;                    //将删除后循环指向前一个字符
                len -= s2.length();        //更新当前S1长度
                
            }
        }
    }

    for (int i = 0; i < len; i++)            //进行输出
    {
        cout << s1[i];
    }
    cout << endl;
    return 0;
}
View Code

下面是AC代码

 1 #include<string>
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     string s1, s2;
 7     getline(cin, s1);            //行输入
 8     getline(cin, s2);
 9     
10     while (s1.find(s2) < s1.length())        //判断S1中是否还存在S2
11     {
12         s1=s1.erase(s1.find(s2), s2.length());        //将S1中的S2删除掉
13     }
14     cout << s1 << endl;
15     
16     return 0;
17 }

我觉得stringchar字符串好用了很多,而且还自带函数简直方便的不行,下面是一个string常用函数用法链接

http://blog.csdn.net/fdqw_sph/article/details/54233971

原文地址:https://www.cnblogs.com/zengguoqiang/p/8335488.html