字符串的查找删除

虽然是道水题,但还是有点东西可写的,顺道学习了一下stringfind()的用法。

最暴力的思路就是找一个删一个,但删除的话必然涉及到大量元素的移动。

int main()
{
    string s;
    cin>>s;
    getchar();

    for(int i=0;i<s.size();i++) s[i]=tolower(s[i]);

    string a,b;
    while(getline(cin,a))
    {
        b=a;
        for(int i=0;i<b.size();i++) b[i]=tolower(b[i]);

        int pos=b.find(s);
        while(pos != string::npos)
        {
            a.erase(pos,s.size());
            b.erase(pos,s.size());
            pos=b.find(s);
        }

        pos=b.find(' ');
        while(pos != string::npos)
        {
            a.erase(pos,1);
            b.erase(pos,1);
            pos=b.find(' ');
        }

        cout<<a<<endl;
    }
    //system("pause");
    return 0;
}

自然想到用空间换时间的做法,新开一个string来存储去除目标字符后的字符串,在查找部分也可以优化一下,让其从指定下标处开始查找。

int main()
{
    string s;
    cin>>s;
    getchar();

    for(int i=0;i<s.size();i++) s[i]=tolower(s[i]);

    string a,b;
    while(getline(cin,a))
    {
        b=a;
        for(int i=0;i<b.size();i++) b[i]=tolower(b[i]);

        int pos1=b.find(s,0),pos2=b.find(' ',0);
        string res;
        for(int i=0;i<b.size();i++)
        {
            if(i == pos1)
            {
                pos1=b.find(s,i+s.size());
                i+=s.size()-1;
            }
            else if(i == pos2)
            {
                pos2=b.find(' ',i+1);
            }
            else res+=a[i];
        }

        cout<<res<<endl;
    }
    //system("pause");
    return 0;
}
posted @ 2021-01-30 14:48  Dazzling!  阅读(110)  评论(0编辑  收藏  举报