zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    常用数列
    sqrt
    树状数组
    hash
    P1102 A-B数对
    codevs 1795 金字塔 2
    P2296 寻找道路
    [USACO16JAN]子共七Subsequences Summing to Sevens
    P3397 地毯
    关于调用&&传址
  • 原文地址:https://www.cnblogs.com/zengguoqiang/p/8335488.html
Copyright © 2011-2022 走看看