需要注意的点太多了,挺麻烦一道题
其实还能优化一下,可以精简很多,但懒得整了
#include <bits/stdc++.h>
using namespace std;
void replacestr(string& str,string str1,string str2)//字符串替换函数
{
int len=str1.size();
int len2=str2.size();
size_t pos = 0; // 初始化搜索位置
//使用find和while,查找所有存在的位置
while ((pos = str.find(str1, pos)) != std::string::npos){
int flag2=0,flag3=0;//flag2,flag3 子字符串前后是否独立
if(pos==0)//子字符串在首
{
flag2=1;
}
else if(isalpha(str[pos-1])==0)
{
flag2=1;
}
if(pos+1==str.size())//子字符串在尾
{
flag3=1;
}
else if(isalpha(str[pos+len])==0)
{
flag3=1;
}
if(flag2==1&&flag3==1)
{
str.replace(pos,len,str2);
pos=pos+len2;
}
else{
pos=pos+len;
}
}
}
void myToLower(string& str)
{
for(int i=0;i<str.size();i++)
{
if(str[i]>='A'&&str[i]<='Z'&&str[i]!='I'){
str[i]+=32;
}
}
}
int main()
{
int n;
cin>>n;
string str;
getchar();
for(int i=0;i<n;i++)
{
getline(cin,str);
cout<<str<<endl;
//去头尾空格
str.erase(0,str.find_first_not_of(" "));
str.erase(str.find_last_not_of(" ") + 1);
//去大于一空格
int space_num=0;
for(int j=0;j<str.size();j++)
{
if(str[j]==' ')
{
space_num++;
}
else if(str[j]!=' ')
{
if(space_num>1)
{
str.erase(j-space_num,space_num-1);
j=j-space_num;
space_num=0;
}
else
{
space_num=0;
}
}
}
//去标点符号前空格
for(int i=0; i<(int)str.size()-1; i++){
if(str[i] == ' ' && (str[i + 1]<'0'|| str[i + 1]> '9') && (str[i + 1]<'A'|| str[i + 1]>'Z') && (str[i + 1]<'a' || str[i + 1]>'z')) {
str.erase(i, 1);
i--;
}
}
//转换为小写
myToLower(str);
replacestr(str,"I","shabi");//注意顺序,区分原I与新I
replacestr(str,"can you","I can");
replacestr(str,"could you","I could");
replacestr(str,"shabi","you");
replacestr(str,"me","you");
//替换?为!
for(int j=0;j<str.size();j++)
{
if(str[j]=='?')
{
str.replace(j,1,"!");
}
}
cout<<"AI: "<<str<<endl;
}
return 0;
}
找到一个大佬的代码,短短20行解决,令我非常震惊,佩服佩服
这是链接:L1-064 估值一亿的AI核心代码 (20 分)-PAT 团体程序设计天梯赛 GPLT – 柳婼 の blog (liuchuo.net)