L1-8 估值一亿的AI核心代码
在家写了写2019年天梯赛的题,被这一道字符串题弄得心态爆炸,自己写了个纯模拟只得了13分,也不想调试了,就去网上看了一下各路大佬写的代码。
我只是个大佬博客的搬运工~
先上题目:
在看各路大佬得解题方法时,发现了个处理字符串问题的好东西,那就是正则表达式,但是有些比赛不支持。
关于正则表达式的介绍,可以看这位大佬的博客:
https://blog.csdn.net/weixin_42449444/article/details/89022191
解题方法看的是这位大佬的博客:
https://blog.csdn.net/xiji333/article/details/104494088
然后自己敲了一遍,写了一些注释:
1 #include<iostream> 2 #include<regex> 3 using namespace std; 4 5 int main(){ 6 int n; 7 cin>>n; 8 getchar();//下面输入字符串的方式是getline,以换行符作为结尾,需要将n输入后的换行符先消耗 9 while(n--){ 10 string s; 11 getline(cin,s); 12 cout<<s<<endl; 13 14 s=regex_replace(s,regex(" +")," ");//将多个空格用一个空格替换 15 if(s[0]==' ') s.erase(0,1);//若第一个字符是空格,就删除 16 if(s[s.size()-1]==' ') s.erase(s.size()-1,1);//若最后一个字符是空格,就删除 17 18 //删除标点符号前面的空格 19 s=regex_replace(s,regex(" \\?"),"?");//?和.都是特殊字符,需要加上\ 20 s=regex_replace(s,regex(" \\."),"."); 21 s=regex_replace(s,regex(" !"),"!"); 22 s=regex_replace(s,regex(" ,"),","); 23 s=regex_replace(s,regex(" '"),"'"); 24 s=regex_replace(s,regex(" ;"),";"); 25 26 //将大写字母(除I)换成小写字母 27 for(int i=0;i<s.size();i++){ 28 if(s[i]>='A' && s[i]<='Z' && s[i]!='I') s[i]=s[i]+'a'-'A'; 29 } 30 31 //这里先换成_I 是因为下面还有将单独的I换成you的命令,这里整体换的地方需要做个标记,下面不用做替换 32 s=regex_replace(s,regex("\\bcan you\\b"),"_I can"); 33 s=regex_replace(s,regex("\\bcould you\\b"),"_I could"); 34 35 s=regex_replace(s,regex("\\bI\\b"),"you"); 36 s=regex_replace(s,regex("\\bme\\b"),"you"); 37 s=regex_replace(s,regex("_I\\b"),"I");//将上面整体替换的标记部分还原 38 39 s=regex_replace(s,regex("\\?"),"!"); 40 41 cout<<"AI: "<<s<<endl; 42 } 43 44 return 0; 45 }
其中,用到了一个转义字符\b,是用来匹配字母或数字边界,\w是字母数字。关于\b的解释可以参考这位大佬的博客:
https://www.cnblogs.com/tnt-33/p/10676473.html
不用正则表达式的做法可以参考这个大佬的博客:
https://blog.csdn.net/qq_41829380/article/details/88919000
我只是个大佬们博客的搬运工~(整理一下,方便自己以后看嘻嘻)