• 删除字符串中的子串 【字符串】


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

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

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

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

    Tomcat is a male ccatat
    cat

    输出样例:

    Tom is a male

    思路
    因为字符串长度不大 所以可以直接 一位一位匹配 去找相同子串

    但是要注意 是删到不能删为止

    比如

    ccatat
    cat

    在cat 删完后 s1 变成 cat

    还能删

    AC代码

    #include <cstdio>
    #include <cstring>
    #include <ctype.h>
    #include <cstdlib>
    #include <cmath>
    #include <climits>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <map>
    #include <stack>
    #include <set>
    #include <numeric>
    #include <sstream>
    #include <iomanip>
    #include <limits>
    
    #define CLR(a) memset(a, 0, sizeof(a))
    #define pb push_back
    
    using namespace std;
    typedef long long ll;
    typedef long double ld;
    typedef unsigned long long ull;
    typedef pair <int, int> pii;
    typedef pair <ll, ll> pll;
    typedef pair<string, int> psi;
    typedef pair<string, string> pss;
    
    const double PI = 3.14159265358979323846264338327;
    const double E = exp(1);
    const double eps = 1e-6;
    
    const int INF = 0x3f3f3f3f;
    const int maxn = 1e5 + 5;
    const int MOD = 1e9 + 7;
    
    int main()
    {
        string s1, s2;
        getline(cin, s1);
        getline(cin, s2);
        int len1 = s1.size();
        int len2 = s2.size();
        if (len1 < len2)
            cout << s1 << endl;
        else if (len1 == len2)
        {
            if (s1 != s2)
                cout << s1;
            cout << endl;
        }
        else
        {
            int flag = 1;
            while (1)
            {
                if (flag == 0)
                    break;
                flag = 0;
                for (int i = 0; i < s1.size(); i++)
                {
                    if (s1[i] == s2[0])
                    {
                        int j, k;
                        for (j = i + 1, k = 1; k < len2 && j < s1.size(); j++, k++)
                            if (s1[j] != s2[k])
                                break;
                        if (k == len2)
                        {
                            flag = 1;
                            s1.erase(i, len2);
                        }
                    }
                }
            }
            cout << s1 << endl;
        }
    }
    
    
    
    
    
    
    
  • 相关阅读:
    网络流
    第k短路(Dijkstra & A*)
    线段树(区间修改)
    线段树(单点修改)
    分块
    单调队列
    NOIP 2006 T2 金明的预算方案
    背包
    CH 6021 走廊泼水节
    关于数字序列匹配的一些问题(lis, lcs, lcis等)
  • 原文地址:https://www.cnblogs.com/Dup4/p/9433203.html
Copyright © 2020-2023  润新知