18101 网络语言过滤器 SCAU 新生赛题解

回过头来看下往年的论剑题
以前看过网上的代码,感觉写的太冗长了,这里分享一下自己的方法
主要思路(string+hashmap):
1.将题目给你要屏蔽的单词全部转化成小写,同时创建一个tmp字符串存储题给字符串除去空格下划线和逗号之后的字符
2.然后核心代码就需要一个循环嵌套,外层是n个要屏蔽的字符,内层是对tmp数组的遍历,用string的find函数找到要修改的字符串出现位置,再replace成星号即可。
3.处理完上面之后会得到一个屏蔽了敏感词、但是不含空格下划线和逗号的字符串,然后只需要拿着这个字符串和原来字符串匹配,再出现空格下划线逗号的地方多添加*即可
最后完整代码刚好百行。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
    string  s;
    getline(cin,s);
    int n;
    vector<string> words;
    map<int ,int> mymap;
    cin>>n;
    for(int i=0;i<n;i++)
    {
            string t;
            cin>>t;
            words.push_back(t);
    }
    string tmp;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]==' '||s[i]=='_'||s[i]==',')
        continue;
        else
        {
             if(s[i]>='A'&&s[i]<='Z')
            {
                 tmp+=(s[i]+32);
                 mymap[tmp.size()-1] = i;
            }
             else
             {
                 tmp+=s[i];
                 mymap[tmp.size()-1] = i;
             }
        }
    }

    string tmp1;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<words[i].size();j++)
        {
            if(words[i][j]>='A'&&words[i][j]<='Z')
            {
                tmp1 +=  (words[i][j]+32);
            }
            else
            tmp1 += words[i][j];
        }
         words[i] = tmp1;
         tmp1.clear();
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<tmp.size();j++)
        {
              auto  pos = tmp.find(words[i],0);
              while(pos!=tmp.npos)
              {
                    if(mymap[pos]==0||s[mymap[pos]-1]==' ')
                    {
                        string tmp2(words[i].size(),'*');
                        tmp.replace(pos,words[i].size(),tmp2);
                    }
                    pos = tmp.find(words[i], pos+1);
              }
        }
    }
    int j=0;
    int flag=0;
    for(int i=0;i<s.size();i++)
    {
         if(s[i]==tmp[j]||tmp[j]-s[i]==32)
         {
             flag = 0;
             j++;
         }
         else
         {
              if(s[i]==' '||s[i]=='_'||s[i]==',')
              {
                  if(flag)
                  {
                      s[i] = '*';
                  }
              }
              else
              {
                  flag = 1;
                  s[i] = '*';
                  j++;
              }
         }
    }
    for(int i=0;i<s.size();i++)
    cout<<s[i];
    cout<<endl;
    return 0;
}

你可能感兴趣的:(SCAU,练习题)