小心有坑,看官莫跳!
我用的方法简单粗暴,分别建立前缀和后缀的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; }