小心有坑,看官莫跳!
我用的方法简单粗暴,分别建立前缀和后缀的map,用#代表word
然后找出前缀扩展表达式s1,和后缀扩展表达式s2
接着决定两个表达式输出顺序,注意不要加主观色彩,即使看起来这样不合理。。。o(╯□╰)o
ans 初始为 “”,接着ans的扩展顺序是: s1的 # 前的部分,s2的 # 前的部分,原始的word,s2 的 # 后的部分,s1的 # 号后的部分
输出ans
#include <iostream>
#include <string>
#include <map>
using namespace std;
//判断 str 是否以 pref 开始
bool startwith(string str, string pref)
{
if(pref.size() > str.size())
return false;
for(int i=0;i<pref.size();++i)
{
if(str[i] != pref[i])
return false;
}
return true;
}
//判断 str 是否以 suf 结尾
bool endwith(string str,string suf)
{
if(suf.size() > str.size())
return false;
for(int i=suf.size()-1,j = str.size()-1;i >= 0;--i,--j)
{
if(str[j] != suf[i])
return false;
}
return true;
}
int main()
{
map<string,string>pref,suf;
pref.insert(make_pair("anti","against #"));
pref.insert(make_pair("post","after #"));
pref.insert(make_pair("pre","before #"));
pref.insert(make_pair("re","# again"));
pref.insert(make_pair("un","not #"));
suf.insert(make_pair("er","one who #s"));
suf.insert(make_pair("ing","to actively #"));
suf.insert(make_pair("ize","change into #"));
suf.insert(make_pair("s","multiple instances of #"));
suf.insert(make_pair("tion","the process of #ing"));
int n;
cin>>n;
while(n--)
{
string str,ans,s1 = "",s2 = "";
cin>>str;
map<string,string>::iterator it = pref.begin();
for(it;it != pref.end();it++)
{
if(startwith(str,it->first))
{
s1 = it->second;
int n1 = it->first.size();
str = str.substr(n1);
break; //我能不能说我开始没有 break 然后WA的好多次...o(╯□╰)o
}
}
for(it = suf.begin();it != suf.end();it++)
{
if(endwith(str,it->first))
{
s2 = it->second;
int n1 = str.size() - it->first.size();
str = str.substr(0,n1);
break;
}
}
int n1 = s1.find('#');
int n2 = s2.find('#');
ans = "";
for(int i = 0;i<n1;++i)
ans += s1[i];
for(int i=0;i<n2;++i)
ans += s2[i];
ans += str;
for(int i = n2 + 1;i<s2.size();++i)
ans += s2[i];
for(int i = n1 +1;i<s1.size();++i)
ans += s1[i];
cout<<ans<<endl;
}
return 0;
}