B2119 删除单词后缀 题解
提供一种较为玄学做法。
我们先不看这种做法,先来看一个
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
cout<<(s.find("er",0)==s.size()-2||s.find("ly",0)==s.size()-2?s.substr(0,s.size()-2):(s.find("ing",0)==s.size()-3?s.substr(0,s.size()-3):s));
return 0;
}
这种方法是想按序找到后缀,然后删除,然而像输入 singing 时,其不是我们所希望的 sing,而是 singing。因为先找到的是 s 后的子串 ing。
既然正着不行,那就——倒着找!
这里涉及到函数 reverse() 及 size(),详见此。但除此还涉及到 find() 和 erase()。
对于 find() 函数的用法:这个函数共有两个参数,一个是查找子串,一个是开始查找位置,对于查找,其会返回首次查到到位置;若找不到,则会返回 string::npos。如在字符串 I Love Luogu. 中查找子串 Luogu,会返回
对于 erase() 函数的用法:这个函数也有两个参数,一个是删除子串的起始位置,一个是删除子串的长度。如在字符串 I Don't Love Luogu. 中删除子串 Don't,则字符串变成 I Love Luogu.。
完整代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
reverse(s.begin(),s.end());//第一次翻转
//由于翻转了,所以子串也要翻转
if(s.find("re",0)==0||s.find("yl",0)==0) s.erase(0,2);//删除长度是二的
else if(s.find("gni",0)==0) s.erase(0,3);//删除长度是三的
reverse(s.begin(),s.end());//重新翻转回来
cout<<s;
return 0;
}